黑马程序员技术交流社区
标题:
突然发现的一个问题过去没遇到过,是怎么回事呢关于try...
[打印本页]
作者:
宋超2356
时间:
2014-3-27 00:45
标题:
突然发现的一个问题过去没遇到过,是怎么回事呢关于try...
本帖最后由 宋超2356 于 2014-3-27 12:01 编辑
<div class="blockcode"><blockquote>import java.io.* ;
public class Test {
public static void main(String [] args) {
File f= new File("c:") ;
try
{
OutputStream out = new FileOutputStream(f) ;
}
catch(Exception e) {
e.printStackTrace();
}
try {
out.close() ;//这里出错
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
复制代码
但是这样就没错
import java.io.* ;
public class Test {
public static void main(String [] args) {
File f= new File("c:") ;
OutputStream out = null ;
try
{
out = new FileOutputStream(f) ;
}
catch(Exception e) {
e.printStackTrace();
}
try {
out.close() ;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
复制代码
为什么
作者:
caijunsong
时间:
2014-3-27 01:29
public class ExceptionDemo
{
public static double div(int a,int b)throws Exception
{
return a/b;
}
public static void main(String[]agrs)
{
int n=5;
int m=2;
try
{
double s=div(m,n);
}
catch (Exception e)
{
e.printStackTrace();
}
System.out.println(s);//这里也会显示s找不到符号
}
}
复制代码
首先我写的这段小代码,你可以直接尝试编译下,你会发现这个编译报错和你第一个代码出现的问题是类似的
都是什么符号没找到,你的代码中是out符号找不到,我的是s符号找不到
至少我们可以直接排除是因为流操作的问题导致的错误吧
我的理解吧 我们是在try中定义了一个变量(你的是out,我的是s),假如在try中的代码没有出错,没有抛出异常的话那么程序就是在try中成功的定义了一个变量(实例),因此在后面我们就可以使用这个变量
假如不知道因为什么原因,try中的代码块出错了,抛出了异常,是不是可以理解为这个引用或变量没用成功的被创建,既然没有成功创建,你怎么能使用一个没有被声明的变量了,所以提示找不到符号,你的第二个代码中,你的out已经被先声明了并初始化为null,然后你在try中假如出现异常,造成的结果是out没有被成功赋值,但他在开头已经被声明了,所以可以使用 书上不是说变量得先声明后使用
我说的比较废话 不够简短 但我觉得你能理解!!
作者:
H-Deka
时间:
2014-3-27 07:29
第一个try中如果发生异常,则out创建失败,第二个try中就会报找不到符号,
作者:
ithmC4
时间:
2014-3-27 09:21
哇哈哈 这个我知道。
3.26日IO公开课老师有讲到,毕姥爷视频也有讲到。
知识点:变量的作用范围是在一段大括号内,大括号内定义的变量在大括号结束后就没了。
OutputStream out = null ;
try{
out = new FileOutputStream(f) ;
//...
//其他代码
}catch(){
}finally{}
复制代码
将变量定义到外面初始化为null,这种书写格式叫做:扩大变量的作用范围
作者:
ithmC4
时间:
2014-3-27 09:25
给你举个简单的例子:
class Demo
{
public static void main(String[] args)
{
int num = 0;
for (int i=0; i<10; i++)
{
num++;
}
System.out.println(num);
System.out.println(i); //编译时这里会提示找不到符号:i,因为你在for内定义的i,for结束后i就没有了
}
}
作者:
MVP
时间:
2014-3-27 09:28
因为你把对象定义在try...catch里面,这样对象只在这个代码块中有效,这个代码块使用完对象就失效了。跟在if()循环里面定义变量是一样原理的,只在这个代码块有效。你这个代码还有很多需要改进的地方,例如,关闭流资源,必须用finally,而且需要判断对象是否为空。
作者:
QQNumber
时间:
2014-3-27 13:21
快(把多个语句用括号{}括起来组成的一个语句)作用域的问题----块是指由一对花括号括起来的若干条简单的JAVA语句,块决定了变量的作用域,也就是说在块里面定义的变量,它的作用范围只能到{}里面的语句执行结束(个人理解是这个变量出了作用范围并不会马上被垃圾回收),你上面的语句如果第二个try语句在第一个里面就不会有错
作者:
syusikoku
时间:
2014-3-27 16:42
是的try里面就相当是一个代码块,如果你把变量给定义在局部代码块里面了,程序执行完了变量即没了。所以如果对象就不存在,你再关闭它就出现了异常。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2