try后面必须跟catch,try里面有try

http://www.itjxue.com  2023-01-18 00:42  来源:未知  点击次数: 

java try 必须跟catch吗

有时候可以不加catch 如下

?public?void?testTryAndFinally(String?name)

?{

????????try?{

????????????name.length();//?NullPointerException

????????}?finally?{

????????????System.out.println("aa");

????????}

?}

传递null调用该方法的执行结果是:在控制台打印aa,并抛出NullPointerException。即程序的执行流程是先执行try块,出现异常后执行finally块,最后向调用者抛出try中的异常。这种执行结果是很正常的,因为没有catch异常处理器,所有该方法只能将产生的异常向外抛;因为有finally,所以会在方法返回抛出异常之前,先执行finally代码块中的清理工作。

这种做法的好处是什么呢?对于testTryAndFinally来说,它做了自己必须要做的事(finally),并向外抛出自己无法处理的异常;对于调用者来说,能够感知出现的异常,并可以按照需要进行处理。也就是说这种结构实现了职责的分离,实现了异常处理(throw)与异常清理(finally)的解耦,让不同的方法专注于自己应该做的事。

那什么时候使用try-finally,什么时候使用try-catch-finally呢?很显然这取决于方法本身是否能够处理try中出现的异常。如果自己可以处理,那么直接catch住,不用抛给方法的调用者;如果自己不知道怎么处理,就应该将异常向外抛,能够让调用者知道发生了异常。即在方法的签名中声明throws可能出现而自己又无法处理的异常,但是在方法内部做自己应该的事情。

为什么catch块要紧跟在try块后面?每个catch块可以处理几种异常?

try catch finally的设计含义就是,试运行一下程序看看会不会抛出异常来,抛出来的话,就判断是不是catch匹配的异常类型,是的话就运行catch块里面的内容,不是的话就运行finally块里面的内容

其中catch块可以有多个,用于捕获不同类型的异常

只写try 不写catch 可以吗

你要从两点上去理解

1、编译器定下的规矩(语法)

编译器定下的规矩,就是try后必须要有catch或finally,不能只出现一个try,而没有catch或者finally。你不这么做,编译器就不把你的.java文件转化为.class文件。

2、设计java语言的意图(语义)

try的意思是,接下来的代码可能会抛出异常,既然你已经表明你的意图了,那你不是该为你的意图做一些工作?有异常,你是不是该处理?怎么处理?用catch和finally。如果你不写catch和finally,那意思就是: 我知道这代码可能有异常,但是我就不处理,这不是流氓嘛,不符合逻辑。

c# try一定要catch吗?

看需求,如果你的程序存在这样的隐患,当然要写,如读写问价,肯定会打开文件流,如果出现异常了,在处理代码部分(catch)处就可以做一些补救措施,如跳转到提示页面、写入错误日志,这些都是很必要的,finally这里呢,就是无论如何都会执行的地方,看需求吧,有必要没必要不是这些人说的这样,完全看程序需求,不要妄下结论!!你想如果是一个涉及金额或积分的程序在没有写数据库事务的情况,在扣除账户金额积分时出现错误,你完全可以在异常后进行补救措施,这能说不需要吗

try{

可能出现异常的代码

}catch(Exception ex){

处理代码

}finally{

处理后无论如何都会执行的代码

}

c++中try后一定要跟catch吗

Unix(包括Linux)下的C语言编程中是不会使用try catch的,的确C也没有这个语法。然而当运行时的错误异常被抛出时,系统会产生信号发送给进程,如果进程没有做信号响应函数的话,就会被中断运行并且产生core文件,通过core文件可以查看程序的崩溃原因、当时的调用堆栈、当时的变量值等等信息,当然这是另外一个话题。

因此在Unix下,与try catch起到相似作用的东西就是信号相应函数。相关的使用方法大体包括如下内容:

1、信号安装

signal();

sigaction();

2、发送信号函数

int raise(int sig);

int pause(void);

int kill(pid_t pid,int sig);

unsigned int alarm(unsigned int seconds);

int sigqueue(pid_t pid,int sig,const union sigval val);

int setitimer(int which,const struct itimerval *value,struct itimerval *oldvalue);

void abort(void)

3、信号集及信号集操作

sigfillset(sigset_t *set);

sigemptyset(sigset_t *set);

sigaddset(sigset_t *set,int sig);

sigdelset(sigset_t *set,int sig);

4、阻塞信号相关函数

int sigprocmask(int how,const sigset_t *set,sigset_t *set);

int sigpending(sigset_t *set);

int sigsuspend(const sigset_t *set);

具体使用方法可参考相应文档

(责任编辑:IT教学网)

更多

推荐浏览下载文章