String f()
{
String ret = null;
try {
ret = doSomeThing(); //执行可能抛出异常的操作
}catch (Exception e)
{
return null; //1
}
return ret; //2
}
1>为什么捕捉到异常后不直接在1处返回呢?我发现它是从2处返回的。2>我把2处的返回写在try块中就没有问题。3>为什么我不使用e对象,也必需声明一个变量名么?不可以像C++中样catch (Exception)么?
{
String ret = null;
try {
ret = doSomeThing(); //执行可能抛出异常的操作
}catch (Exception e)
{
return null; //1
}
return ret; //2
}
1>为什么捕捉到异常后不直接在1处返回呢?我发现它是从2处返回的。2>我把2处的返回写在try块中就没有问题。3>为什么我不使用e对象,也必需声明一个变量名么?不可以像C++中样catch (Exception)么?
String f()
{
String ret = null;
try {
ret = doSomeThing(); //执行可能抛出异常的操作
}catch (Exception e)
{
return null; //1
}
return ret.toString(); //2
}
那这样也没问题啊,可为什么会报我空指针异常呢?按理说应该不会执行到ret.toString的啊。
再说了你的return null 是空啊
还有 ret.toString(); 你得抛出异常啊 没有的话就有空指针了
这时try里面的ret还是null
null不会有toString();方法
你最开始说是从2返回是怎么看出来的?关于问题3 需要。
============================
为什么没有呢?抛出异常后不是执行catch么?catch里不是有返回null么?返回一个null给String应该没问题吧?(只要我调用这个函数的程序会判断返回值就行了)你最开始说是从2返回是怎么看出来的?
===========================
因为我发现在抛出异常后ret确实是null,但它还是去执行了ret.toString()操作。
而这明显会有个Run-TimeNullPointException被抛出,但我并没有去catch.所以中止了程序。
package sss;
public class a{
public static void main(String[] args){
ddd d=new ddd();
System.out.println(d.f());
}
}
class ddd{
public String f()
{
String ret = null;
try {
ret = ret.toString(); //执行可能抛出异常的操作
}catch (Exception e)
{
System.out.println("一处异常");
return "dfdf"; //1
}
return ret; //2
}
}
{
String ret = null;
try {
ret = doSomeThing(); //执行可能抛出异常的操作
}catch (Exception e)
{
return null; //1
}
return ret.toString(); //2
}
那这样也没问题啊,可为什么会报我空指针异常呢?按理说应该不会执行到ret.toString的啊。
这段程序先运行1处的return,再运行2处的return, ret为空,当然报指针异常啦!
还有运行两个return的说法???
还有运行两个return的说法???
====================================================================================
有的吧
return 只是退出它所在的最内层方法好像
{
String ret = null;
System.out.println("========1========");
try {
System.out.println("========2========");
ret = doSomeThing(); //执行可能抛出异常的操作
System.out.println("========3========");
}catch (Exception e)
{
System.out.println("========4========");
return null; //1
System.out.println("========5========");
}
System.out.println("========6========");
return ret; //2
System.out.println("========7========");
}
如果doSomeThing中已经catch了,显然就不会外面不能catch到异常了,就是不会到1啦。
{
String ret = null;
try {
ret = doSomeThing(); //执行可能抛出异常的操作
}catch (Exception e)
{
return null; //1
}
return ret; //2
}
1>为什么捕捉到异常后不直接在1处返回呢?我发现它是从2处返回的。2>我把2处的返回写在try块中就没有问题。3>为什么我不使用e对象,也必需声明一个变量名么?不可以像C++中样catch (Exception)么?捕捉异常后,如果真的出现异常(一种是你在前面抛出了异常,一种是你的代码确实有异常),才会执行catch里的代码,通常都是跳出,执行try 和catch外的代码。这些你可以自己试试。
catch 中即使不使用e对象也要声明一个变量名,这是格式,硬性规定,就好象int 后也必须加东西一样,只有int是不符合语法的!!!
但是编译程序应该是不通过的,因为没有规定一定要在catch里面return。
如果在catch里面没有return,那么catch运行完后就会运行最后面的东西,也就是ret.toString();所以会报错说你没初始化。
{
String ret = null;
try
{
ret =ret.ToString(); //执行可能抛出异常的操作
}
catch (Exception e)
{
return null; //1
}
return ret.ToString();//2
}
在"//执行可能抛出异常的操作"的ret.ToString();肯定会抛出异常,但是它不会执行到2处