how2j.cn

本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



4分55秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)



示例 1 : 创建自定义异常   
示例 2 : 抛出自定义异常   
示例 3 : 练习-自定义异常   
示例 4 : 答案-自定义异常   

示例 1 :

创建自定义异常

edit
一个英雄攻击另一个英雄的时候,如果发现另一个英雄已经挂了,就会抛出EnemyHeroIsDeadException
创建一个类EnemyHeroIsDeadException,并继承Exception
提供两个构造方法
1. 无参的构造方法
2. 带参的构造方法,并调用父类的对应的构造方法
class EnemyHeroIsDeadException extends Exception{ public EnemyHeroIsDeadException(){ } public EnemyHeroIsDeadException(String msg){ super(msg); } }
class EnemyHeroIsDeadException extends Exception{
    
	public EnemyHeroIsDeadException(){
		
	}
    public EnemyHeroIsDeadException(String msg){
        super(msg);
    }
}
示例 2 :

抛出自定义异常

edit
在Hero的attack方法中,当发现敌方英雄的血量为0的时候,抛出该异常
1. 创建一个EnemyHeroIsDeadException实例
2. 通过throw 抛出该异常
3. 当前方法通过 throws 抛出该异常

在外部调用attack方法的时候,就需要进行捕捉,并且捕捉的时候,可以通过e.getMessage() 获取当时出错的具体原因
抛出自定义异常
package charactor; public class Hero { public String name; protected float hp; public void attackHero(Hero h) throws EnemyHeroIsDeadException{ if(h.hp == 0){ throw new EnemyHeroIsDeadException(h.name + " 已经挂了,不需要施放技能" ); } } public String toString(){ return name; } class EnemyHeroIsDeadException extends Exception{ public EnemyHeroIsDeadException(){ } public EnemyHeroIsDeadException(String msg){ super(msg); } } public static void main(String[] args) { Hero garen = new Hero(); garen.name = "盖伦"; garen.hp = 616; Hero teemo = new Hero(); teemo.name = "提莫"; teemo.hp = 0; try { garen.attackHero(teemo); } catch (EnemyHeroIsDeadException e) { // TODO Auto-generated catch block System.out.println("异常的具体原因:"+e.getMessage()); e.printStackTrace(); } } }
示例 3 :

练习-自定义异常

edit Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
MyStringBuffer的插入和删除方法中的边界条件判断,用抛出异常来解决
例: insert(int pos, String b) , 当pos 是负数的时候,抛出自定义异常
需要实现自定义两种异常
IndexIsNagetiveException 下标为负异常
IndexIsOutofRangeException 下标超出范围异常
以下是需要调用这些异常的场景:

pos<0

抛出 IndexIsNagetiveException

pos>length

抛出 IndexIsOutofRangeException


null==b

抛出 NullPointerException


start<0

抛出 IndexIsNagetiveException


start>length

抛出 IndexIsOutofRangeException


end<0

抛出 IndexIsNagetiveException


end>length

抛出 IndexIsOutofRangeException


start>=end

抛出 IndexIsOutofRangeException

注意: 接口IStringBuffer中声明的方法需要抛出异常
示例 4 :

答案-自定义异常

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

4分51秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)


package exception; public class IndexIsNagetiveException extends Exception{ }
package exception; public class IndexIsOutofRangeException extends Exception { }
package character; import exception.IndexIsNagetiveException; import exception.IndexIsOutofRangeException; public interface IStringBuffer { public void append(String str) throws IndexIsOutofRangeException, IndexIsNagetiveException; ; //追加字符串 public void append(char c) throws IndexIsOutofRangeException, IndexIsNagetiveException; ; //追加字符 public void insert(int pos,char b) throws IndexIsOutofRangeException, IndexIsNagetiveException; //指定位置插入字符 public void insert(int pos,String b) throws IndexIsOutofRangeException, IndexIsNagetiveException; ; //指定位置插入字符串 public void delete(int start) throws IndexIsOutofRangeException, IndexIsNagetiveException; ; //从开始位置删除剩下的 public void delete(int start,int end) throws IndexIsOutofRangeException, IndexIsNagetiveException; ; //从开始位置删除结束位置-1 public void reverse(); //反转 public int length(); //返回长度 }
package character; import exception.IndexIsNagetiveException; import exception.IndexIsOutofRangeException; public class MyStringBuffer implements IStringBuffer { int capacity = 16; int length = 0; char[] value; public MyStringBuffer() { value = new char[capacity]; } // 有参构造方法 public MyStringBuffer(String str) { this(); if (null == str) return; if (capacity < str.length()) { capacity = value.length * 2; value = new char[capacity]; } if (capacity >= str.length()) System.arraycopy(str.toCharArray(), 0, value, 0, str.length()); length = str.length(); } @Override public void append(String str) throws IndexIsNagetiveException, IndexIsOutofRangeException { insert(length, str); } @Override public void append(char c) throws IndexIsNagetiveException, IndexIsOutofRangeException { append(String.valueOf(c)); } @Override public void insert(int pos, char b) throws IndexIsNagetiveException, IndexIsOutofRangeException { insert(pos, String.valueOf(b)); } @Override public void delete(int start) throws IndexIsNagetiveException, IndexIsOutofRangeException { delete(start, length); } @Override public void delete(int start, int end) throws IndexIsNagetiveException, IndexIsOutofRangeException { // 边界条件判断 if (start < 0) throw new IndexIsNagetiveException(); if (start > length) throw new IndexIsOutofRangeException(); if (end < 0) throw new IndexIsNagetiveException(); if (end > length) throw new IndexIsOutofRangeException(); if (start >= end) throw new IndexIsOutofRangeException(); System.arraycopy(value, end, value, start, length - end); length -= end - start; } @Override public void reverse() { for (int i = 0; i < length / 2; i++) { char temp = value[i]; value[i] = value[length - i - 1]; value[length - i - 1] = temp; } } @Override public int length() { // TODO Auto-generated method stub return length; } @Override public void insert(int pos, String b) throws IndexIsNagetiveException, IndexIsOutofRangeException { // 边界条件判断 if (pos < 0) throw new IndexIsNagetiveException(); if (pos > length) throw new IndexIsOutofRangeException(); if (null == b) throw new NullPointerException(); // 扩容 if (length + b.length() > capacity) { capacity = (int) ((length + b.length()) * 2.5f); char[] newValue = new char[capacity]; System.arraycopy(value, 0, newValue, 0, length); value = newValue; } char[] cs = b.toCharArray(); // 先把已经存在的数据往后移 System.arraycopy(value, pos, value, pos + cs.length, length - pos); // 把要插入的数据插入到指定位置 System.arraycopy(cs, 0, value, pos, cs.length); length = length + cs.length; } public String toString() { char[] realValue = new char[length]; System.arraycopy(value, 0, realValue, 0, length); return new String(realValue); } public static void main(String[] args) { try { MyStringBuffer sb = new MyStringBuffer("there light"); System.out.println(sb); sb.insert(0, "let "); System.out.println(sb); sb.insert(10, "be "); System.out.println(sb); sb.insert(0, "God Say:"); System.out.println(sb); sb.append("!"); System.out.println(sb); sb.append('?'); System.out.println(sb); sb.reverse(); System.out.println(sb); sb.reverse(); System.out.println(sb); sb.delete(0, 4); System.out.println(sb); sb.delete(4); System.out.println(sb); } catch (IndexIsNagetiveException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IndexIsOutofRangeException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2019-05-21 ZZ交作业 自定义异常
来载



there light let there light let there be light God Say:let there be light God Say:let there be light! God Say:let there be light!? ?!thgil eb ereht tel:yaS doG God Say:let there be light!? 下标超出范围异常 结束 exceptiontest.How2jStringBuffer$IndexIsOutofRangeException: 下标超出范围异常 at exceptiontest.How2jStringBuffer.delete(How2jStringBuffer.java:76) at exceptiontest.How2jStringBuffer.main(How2jStringBuffer.java:144) 有异常一律throws到main里面处理
package exceptiontest;

public class How2jStringBuffer implements How2j {
	int capacity = 16;
	int length = 0;
	char[] value;

	public How2jStringBuffer() {
		value = new char[capacity];
	}

	// 有参构造方法
	public How2jStringBuffer(String str) {
		this();
		if (null == str)
			return;
		if (capacity < str.length()) {
			capacity = value.length * 2;
			value = new char[capacity];
		}
		if (capacity >= str.length())
			System.arraycopy(str.toCharArray(), 0, value, 0, str.length());
		length = str.length();
	}

	class IndexIsNagetiveException extends Exception {
		public IndexIsNagetiveException() {
		}

		public IndexIsNagetiveException(String msg) {
			super(msg);
		}
	}

	class IndexIsOutofRangeException extends Exception {
		public IndexIsOutofRangeException() {
		}

		public IndexIsOutofRangeException(String msg) {
			super(msg);
		}
	}

	@Override
	public void append(String str) throws Exception {
		insert(length, str);
	}

	@Override
	public void append(char c) throws Exception {
		append(String.valueOf(c));
	}

	@Override
	public void insert(int pos, char b) throws Exception {
		insert(pos, String.valueOf(b));
	}

	@Override
	public void delete(int start) throws Exception {
		delete(start, length);
	}

	@Override
	public void delete(int start, int end) throws Exception {
		// 边界条件判断
		if (start < 0)
			throw new IndexIsNagetiveException("下标为负异常");
		if (start > length)
			throw new IndexIsOutofRangeException("下标超出范围异常");
		if (end < 0)
			throw new IndexIsNagetiveException("下标为负异常");
		if (end > length)
			throw new IndexIsOutofRangeException("下标超出范围异常");
		if (start >= end)
			throw new IndexIsOutofRangeException("下标超出范围异常");
		System.arraycopy(value, end, value, start, length - end);
		length -= end - start;
	}

	@Override
	public void reverse() {
		for (int i = 0; i < length / 2; i++) {
			char temp = value[i];
			value[i] = value[length - i - 1];
			value[length - i - 1] = temp;
		}
	}

	@Override
	public int length() {
		// TODO Auto-generated method stub
		return length;
	}

	@Override
	public void insert(int pos, String b) throws Exception {
		// 边界条件判断
		if (pos < 0)
			throw new IndexIsNagetiveException("插入位置下标为负异常");
		if (pos > length)
			throw new IndexIsOutofRangeException("插入位置下标超出范围异常");
		if (null == b)
			throw new NullPointerException();
		// 扩容
		while (length + b.length() > capacity) {
			capacity = (int) ((length + b.length()) * 1.5f);
			char[] newValue = new char[capacity];
			System.arraycopy(value, 0, newValue, 0, length);
			value = newValue;
		}
		char[] cs = b.toCharArray();
		// 先把已经存在的数据往后移
		System.arraycopy(value, pos, value, pos + cs.length, length - pos);
		// 把要插入的数据插入到指定位置
		System.arraycopy(cs, 0, value, pos, cs.length);
		length = length + cs.length;
	}

	public String toString() {
		char[] realValue = new char[length];
		System.arraycopy(value, 0, realValue, 0, length);
		return new String(realValue);
	}

	public static void main(String[] args) {
		try {
			How2jStringBuffer sb = new How2jStringBuffer("there light");
			System.out.println(sb);
			sb.insert(0, "let ");
			System.out.println(sb);
			sb.insert(10, "be ");
			System.out.println(sb);
			sb.insert(0, "God Say:");
			System.out.println(sb);
			sb.append("!");
			System.out.println(sb);
			sb.append('?');
			System.out.println(sb);
			sb.reverse();
			System.out.println(sb);
			sb.reverse();
			System.out.println(sb);
			sb.delete(4, 4);
			System.out.println(sb);
			sb.delete(4);
			System.out.println(sb);
		} catch (Throwable t) {
			System.out.println(t.getMessage());
			t.printStackTrace();
		} finally {
			System.out.println("结束");
		}
	}
}

							





回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2019-04-24 交作业:有参构造函数
tju123456



个人认为答案有参构造方法有问题,当插入字符串长度大于2倍初始长度16时出现越界异常,扩容时应用2倍的str.length() 有参构造函数按答案中的写法,主函数测试中第一句创建sb1时会出错
package exception;

import exception.IndexIsNagetiveException;
import exception.IndexIsOutofRangeException;

/*对MyStringBuffer的插入和删除方法中的边界条件判断,用抛出异常来解决
例: insert(int pos, String b) , 当pos 是负数的时候,抛出自定义异常
需要实现自定义两种异常 
IndexIsNagetiveException 下标为负异常
IndexIsOutofRangeException 下标超出范围异常
*/
public class MyStringBuffer implements IStringBuffer{
	
	int capacity=16;//定义容量
	int length=0;//定义初始有效长度
	char[] value;
	
	//无参构造函数,创建对象时同时创建char数组
	public MyStringBuffer() {
		value=new char[capacity]; 
	}
	
	//有参构造函数
	public MyStringBuffer(String str) {
		this();//调用无参构造函数,创建char数组
		
		//如果字符串为空,返回
		if(null==str)
			return;
		//如果char数组的长度小于字符串长度,则扩容为字符串两倍长度
		if(capacity<str.length()) {
			capacity=str.length()*2;
			value=new char[capacity];
		}
		//如果char数组的长度大于字符串长度,则将字符串转换为字符数组复制到char中
		//注:因为上一个if,当char数组长度小于字符串长度,则会进入上一个if扩容后复制,如果
		//    char数组长度大于等于字符串长度,则直接复制,所以此处的if必然会执行
//		if(capacity>=str.length()) {
			System.arraycopy(str.toCharArray(), 0, value, 0, str.length());
//		}
		
		length=str.length();
	}
	
	//覆盖追加字符串方法
	@Override
	public void append(String str) throws IndexIsNagetiveException, IndexIsOutofRangeException{
		insert(length,str);//在length位置插入字符串str
	}
	//覆盖追加字符方法
	@Override
	public void append(char c) throws IndexIsNagetiveException, IndexIsOutofRangeException{
//		insert(length,c);
		append(String.valueOf(c));//调用追加字符串的方法
	}
	//覆盖指定位置插入字符
	@Override
	public void insert(int pos,char b) throws IndexIsNagetiveException, IndexIsOutofRangeException{
		insert(pos,String.valueOf(b));//在pos下标位置插入字符串b
	}
	//覆盖指定位置插入字符串
	@Override
	public void insert(int pos,String b) throws IndexIsNagetiveException, IndexIsOutofRangeException{
		if(pos<0) 
			throw new IndexIsNagetiveException();
		if(pos>length)
			throw new IndexIsOutofRangeException();
		if(null==b)
			throw new NullPointerException();//字符串空异常
		if(length+b.length()>capacity) {
			capacity=2*(length+b.length());
			char[] newValue=new char[capacity];//创建新的字符数组,空间为新的capacity
			System.arraycopy(value, 0, newValue, 0, length);//将value内容复制到newValue中
			value=newValue;//让value指向newValue指向的字符数组
		}
		char[] bToChar=b.toCharArray();//将字符串b转换为字符数组
		//将已经存在的数据往后移
		System.arraycopy(value, pos, value, pos+bToChar.length, length-pos);
		//把要插入的数据插入到指定位置
		System.arraycopy(bToChar, 0, value, pos, bToChar.length);
		
		length+=bToChar.length;		
	}
	//覆盖从开始位置删除剩下的
	@Override
	public void delete(int start) throws IndexIsNagetiveException, IndexIsOutofRangeException{
		delete(start,length);
	}
	//覆盖从开始位置删除结束位置-1
	@Override
	public void delete(int start,int end) throws IndexIsNagetiveException, IndexIsOutofRangeException{
		if(start<0)
			throw new IndexIsNagetiveException();
		if(start>length)
			throw new IndexIsOutofRangeException();
		if(end<0)
			throw new IndexIsNagetiveException();
		if(end>length)
			throw new IndexIsOutofRangeException();
		if(start>=end)
			throw new IndexIsOutofRangeException();
		System.arraycopy(value, end, value, start, length-end);
		
		length=length-(end-start);
	}
	//覆盖翻转
	@Override
	public void reverse() {
		for(int i=0;i<length/2;i++) {
			char change=value[i];
			value[i]=value[length-1-i];
			value[length-1-i]=change;
		}
	}
	//覆盖返回长度
	@Override
	public int length() {
		return length;
	}
	
	//将字符数组转换为字符串(重写的toString())
	 public String toString() {
		 
	        char[] realValue = new char[length];
	 
	        System.arraycopy(value, 0, realValue, 0, length);
	 
	        return new String(realValue);
	 
	    }
	
	
	//主函数测试
	public static void main(String[] args) {
		try {
			MyStringBuffer sb1=new MyStringBuffer("there light there light there light there light");
			MyStringBuffer sb=new MyStringBuffer("there light");
			System.out.println(sb.toString());
			sb.insert(0, "let ");
			System.out.println(sb);//默认调用toString()函数
			sb.insert(10, "be ");
			System.out.println(sb);
			sb.insert(0, "God say:");
			System.out.println(sb);
			sb.append(" !");
			System.out.println(sb);
			sb.append("?");
			System.out.println(sb);
			sb.reverse();
			System.out.println(sb);
			sb.reverse();
			System.out.println(sb);
			sb.delete(0 , 4);
			System.out.println(sb);
			sb.delete(4);
			System.out.println(sb);
			
		}catch(IndexIsNagetiveException e) {
			e.printStackTrace();
		}catch(IndexIsOutofRangeException e) {
			e.printStackTrace();
		}
	}

}

							





回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2019-04-23 加油周二
2019-03-23 自己的总结
2019-03-12 可以直接throws Exception吗?
2019-02-25 周瑜打黄盖,一个攻一个受
2019-02-14 如何同时报两个关于下标的异常
2018-12-27 public String toString()这个起什么作用啊
2018-12-20 toString()方法在示例2中并未使用,请问这方法留在这有什么意义吗
2018-12-20 toString()
2018-10-09 作业
2018-09-02 按在地上摩擦~
2018-05-29 还是关于带参构造方法中 传string类型参数 调用父类构造方法的疑惑
2018-05-29 带参的构造方法,并调用父类的对应的构造方法
2018-05-05 请问e.getMessage()这个方法从哪儿来的
2018-04-19 append内部做try, catch
2018-03-24 交作业
2018-01-18 视频播放问题……
2018-01-14 我的自定义Exception为什么不能是public? 而去掉后就好了,why?
2018-01-14 站长打错了个英文单词。。Negative
2017-12-23 继承中, this指向问题。。。
2017-11-14 无法自定义异常
2017-11-13 请问throw和throws是结合起来用的吗?
2017-09-10 站长,EnemyHeroIsDeadException的无参构造方法有什么用呢?
2017-08-10 如果英雄name的定义是public类型的,那为什么还要定义toString()方法呢?
2017-08-08 练习题
2017-07-14 子类可以访问父类的私有变量吗
2017-05-15 super(msg)中的super指的就是exception这一个父类吗?这是调用的exception的有参构造方法?
2017-03-26 为什么要把msg传给父类呢
2017-03-21 我比较笨,还望站长说的详细一些
2017-02-10 提问测试
2016-12-07 还是不太清楚capacity,length和value这三个分别什么意思
2016-09-30 Nagetive拼错了




提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 JAVA 中级-异常处理-自定义异常 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 1001964108
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: http://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图