A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 冯心程 于 2012-7-11 15:50 编辑

这个问题老蒙圈 求指点迷津

10 个回复

倒序浏览
当发生的问题调用者不能解决的时候不能抛,当父类没有抛的时候不能抛,如果抛的是检测时异常在函数上必须声明,当是运行时异常时不用在函数上声明。
回复 使用道具 举报
摘自网络一个例子,讲的很精辟
public int arrOut(int[] arr, int index)//输出函数//声明
{     try
{
if (index < 0)
throw new FushuIndexException(“数组角标不能为负数啊”);
}
catch{}
return arr[index];
}
如果调用者传递一个负数角标,发生异常,我们需要try吗?我们try的话,arr还是没有值,在内部没有解决这个问题。这个问题是调用者的问题,他传值错误,那是他的问题,所以我们声明出去,直接告诉他你传的值错误,我们没有必要再try catch。

public static void main(String[] args)   {
int[] arr = new int[5];
Demo d = new Demo();
try   {
int num = d.arrOut(arr, -4);
System.out.println(“num: ” + num);
}
catch(FuShuIndexException e)//处理要有针对性
{
System.out.println(“数组角标越界”)
}
System.out.println(“Over”);
}

在调用的时候又出现问题,我们能处理吗?我们的原则就是能处理就try处理不了就抛。

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
try指定一块可能有"异常"的程序。在try后面,包含一个catch子句来指定你想要捕捉的"异常"的类型。
throw语句用来明确地抛出一个"异常"。可以抛出自定义异常
回复 使用道具 举报
用try来指定一块预防所有"异常"的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的"异常"的类型。
throw语句用来明确地抛出一个"异常"。
throws用来标明一个成员函数可能抛出的各种"异常"。
可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,"异常"的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种"异常"进行处理,堆栈就会展开,直到遇到有处理这种"异常"的try语句。
异常的处理办法抛或者try
抛 throw和throws throw用在函数体内  后面接的是异常对象  throws用在函数上 后面接的是类名可以多个用逗号连接 当里函数体内抛了编译期异常 函数上就要throws该异常对象 当你函数上抛了编译期异常调用处就需要try 或继续抛 如果跑调用处的函数也要抛相应异常 直到抛给JVM JVM会按默认方法处理异常那就是程序结束 打印堆栈信息
当然也可以用try catch finally处理
catch语句书写时父类要放到子类的后面否则会编译不通过  应为程序不知道执行哪条异常语句如
try{
  会发生溢出的代码
}catch(Exception e){
  处理异常的代码
}catch(RuntimeException e){   
}finally{
  一定会执行的代码 通常用来释放资源  
}
上面的代码会变异错误 应该写成下面的形式
try{
  会发生溢出的代码
}catch(RuntimeException e){
  处理异常的代码
}catch(Exception e){   
}
有3种形式  catch语句可以多个  一般抛出了几个异常就用几个catch语句捕获
1
try{
}catch(Exception e){
}
2
try{
}finally{
} 这种形式并没有处理异常 如果是编译器异常 函数上要声明该异常即跑出该异常

3
try{
}catch(Exception e){
}finally{
};

finally只有一种情况不会被执行其他的都会执行 就是执行该语句块时 出现了System.exit(0);或System.exit(1);语句时不会执行

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
如果你调用的函数有可能抛出异常那你就一定要捕获这个异常,这个是java的规定,若没有用try catch 或者在方法定义的时候没有throws 那些异常,那么那个类是连编译都编不过去的...比如有这么一个方法
void testNull(Object obj)
{
    if(obj==null)
      throw new NullPointException("obj is null"); //抛出一个异常
}

而另一个函数需要调用它,那就得用到try catch去捕获这个异常...否则那个类是编译不了的。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
try{
   //有可能出现异常的代码 ;
}catch(异常类 异常对象){
   //编写异常的处理方法 ;
}.
.
.
{
...
}catch(异常类 异常对象){
   //好比这个异常想要抛出就用 throw 异常对象 ;
}finally{
//一定会运行到的代码 ;
}



捕捉异常处理方法可以编写多个。还有一个是throws,是在定义方法的时候用来声明方法的,用throws声明的方法表示方法不处理异常,而交给方法的调用处进行处理。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
冯心程 黑马帝 2012-7-11 15:50:18
8#
OOOK 多謝
回复 使用道具 举报
简单说,当你不知道那段代码会发生什么什么情况的时候,就可以用throw来抛出异常信息,反之亦然!

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
程序运行过程中可能会出现异常情况,比如被0除、对负数计算平方根等,还有可能会出现致命的错误,比如内存不足,磁盘损坏无法读取文件等,对于异常和错误情况的处理,统称为异常处理。
    Java异常处理主要通过5个关键字控制:try、catch、throw、throws和finally。try的意思是试试它所包含的代码段中是否会发生异常;而catch当有异常时抓住它,并进行相应的处理,使程序不受异常的影响而继续执行下去;throw是在程序中明确引发异常;throws的作用是如果一个方法可以引发异常,而它本身并不对该异常处理,那么它必须将这个异常抛给调用它的方法;finally是无论发不发生异常都要被执行的代码
   
    关键字:throw,throws,try和catch的用法如下:
        1、throws出现在方法的声明中,表示该方法可能会抛出的异常,允许throws后面跟着多个异常类型
        2、throw出现在方法体中,用于抛出异常。当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后throw。
        3、try出现在方法体中,它自身是一个代码块,表示尝试执行代码块的语句。如果在执行过程中有某条语句抛出异常,那么代码块后面的语句将不被执行。
        4、catch出现在try代码块的后面,自身也是一个代码块,用于捕获异常try代码块中可能抛出的异常。catch关键字后面紧接着它能捕获的异常类型,所有异常类型的子类异常也能被捕获。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
throw,throws和try catch的联系、区别

区别一:throw 是语句抛出一个异常;throws 是方法抛出一个异常;
throw语法:throw <异常对象>
在方法声明中,添加throws子句表示该方法将抛出异常。如果一个方法会有异常,但你并不想处理这个异常,就在方法名后面用throws,这样这个异常就会抛出,谁调用了这个方法谁就要处理这个异常,或者继续抛出.
throws语法:[<修饰符>]<返回值类型><方法名>([<参数列表>])[throws<异常类>]
其中:异常类可以声明多个,用逗号分割。
区别二:throw要么和try-catch-finally语句配套使用,要么与throws配套使用。但throws可以单独使用,然后再由处理异常的方法捕获。

联系一:try .... catch 就是用catch 捕获 try 中的异常,并处理;catch是捕获异常。也就是说某一个操作有可能会抛出什么异常。throw 就是不处理异常,直接抛出异常


调用一个会throws exception的方法(在方法定义的时候可以用throws实现)时,需要把这个方法放在try里,然后用catch破获这个exception,做相应的处理。

throw new exception()是抛出一个exception,由别的method来破获它。


也就是说try....catch是为破获别人的exception用的,而throw是自己抛出exception让别人去破获的。


public void input() throws Exception

{ }

public void outputException()

{

   try {

       input();

}

catch(Exception e)

{

System.out.println("Exception");

}

}


简单的说,如果一个方法中用了throws,那么这个方法会向上抛出一个异常,那么在调用这个方法的时候必须把这个调用放在try...catch块里处理这个异常。


对于异常有两种处理方法

1、要么声明异常,也就是在方法名后面加上throws exceptionname,..., 方法本身只是抛出异常,由函数调用者来捕获异常。若产生异常,异常会沿着调用栈下移,一直找到与之匹配的处理方法,若到达调用栈底仍未找到,程序终止。

2、要么捕获异常。通过try catch方法,catch子句中放置处理异常的语句。


联系二:对于会觉得会有异常抛出的程序块,用try{}包住,然后用catch来抓住这个异常,在catch中对异常做处理, 在try中如果有异常的话,程序会转到catch而不会中断,通常这两个是配合使用的,如果你不想因为程序有错,而抛出一大堆异常的话,你就把该程序try起来,try和catch只能获取程序运行时引发的异常,而throw语句可以引发明确的异常,程序到了throw语句这后就立即停止,不会执行后面的程序,


大家也许在编程的过程中,会意识到这里出错,但不知道会抛出什么异常,也是一件头疼的事,现将这部分总结如下:
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
方法未找到异常:NoSuchMethodException

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马