没有抛异常的方法,即使给的参数有误也不会报错,是吗?

SilentHunter460 2020-07-25 12:12:52
g.drawImage(new ImageIcon("assets/images/tankD.git").getImage(), 400, 100, null);

ImageIcon类的getImage方法,API是这样:public Image getImage()
如果"assets/images/tankD.git"这条路径有误,程序不会报错。


try {
g.drawImage(ImageIO.read(new File("assets/images/tankD.git")), 400, 100, null);
} catch (IOException e) {
e.printStackTrace();
}

ImageIO类的read方法,API是:public static BufferedImage read(File input) throws IOException
如果"assets/images/tankD.git"这条路径有误,程序就会报错了。

所以我的问题是:
是否带有throws IOException的方法,能方便查找问题,没有的就不便排查?
没有抛异常能力的方法,刻意写try catch也是没有作用,对吧?
...全文
5967 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
SilentHunter460 2020-07-29
  • 打赏
  • 举报
回复
引用 12 楼 qybao 的回复:
[quote=引用 11 楼 qybao 的回复:]
    @Override
    public void paint(Graphics g) {
        ImageIcon ii = new ImageIcon("xxxx/xxxx/xxx.jpg"); //看看是否创建了一个ImageIcon对象,且没有size
        System.out.printf("w=%d, h=%d\n", ii.getWidth(), ii.getHeight()); //用个真实有效的文件试试size是多少?不存在的文件size是多少?
        g.drawImage(ii.getImage(), 300, 300, null); //所以这里不会绘画任何东西
    }
以后遇到问题多看看文档
上面笔误, ii.getWidth()改成ii.getIconWidth(), ii.getIconHeight[/quote] 是的,以后养成看文档习惯。 以前我只会看Run窗口有没有显示任何错误信息,比如1/0就会。 但是改用这个类的方法就会立即警告了,所以我觉得这个类的方法比ImageIcon类的getImage方法好。 @Override public void paint(Graphics g) { try { g.drawImage(ImageIO.read(new File("xxxx/xxxx/xx.jpg")), 300, 300, null); } catch (IOException e) { e.printStackTrace(); } }
SilentHunter460 2020-07-27
  • 打赏
  • 举报
回复
引用 5 楼 qybao 的回复:
你不抛出异常不代表程序运行没有异常,就像3L说的运行时异常 比如 int a=5,b=0 int c=a/b 虽然你不抛出异常,但是你运行代码就会出现除0异常 所以try catch本身不是取决于你抛不抛出异常,而是取决于是不是会发生异常,以及你有没有捕捉相应的异常
你好,请看以下代码,给一条错误路径或图片名,结果不显示图片也不报错。 按理说此时应该产生运行时异常,道理应该同1/0类似。

import javax.swing.*;
import java.awt.*;

public class test extends JFrame {

    test(){
        this.setDefaultCloseOperation(3);
        this.setSize(800, 600);
        this.setLocation(300, 40);
    }

    @Override
    public void paint(Graphics g) {
        g.drawImage(new ImageIcon("xxxx/xxxx/xxx.jpg").getImage(), 300, 300, null);
    }

    public static void main(String[] args) {
        new test().setVisible(true);
    }
}
SilentHunter460 2020-07-27
  • 打赏
  • 举报
回复
引用 11 楼 qybao 的回复:
[quote=引用 10 楼 qq_16774199 的回复:] 你怎么判断它出运行时异常了? 你好好查看java的文档 https://docs.oracle.com/javase/8/docs/api/javax/swing/ImageIcon.html 点击如何使用Icons的链接 see How to Use Icons in The Java Tutorial. 里面有段描述 When you specify a filename or URL to an ImageIcon constructor, processing is blocked until after the image data is completely loaded or the data location has proven to be invalid. If the data location is invalid (but non-null), an ImageIcon is still successfully created; it just has no size and, therefore, paints nothing. As shown in the createImageIcon method, it is advisable to first verify that the URL points to an existing file before passing it to the ImageIcon constructor. This allows graceful error handling when the file isn't present. If you want more information while the image is loading, you can register an observer on an image icon by calling its setImageObserver method. 如果location是无效的(只要是非null,哪怕是路径不存在也一样),ImageIcode对像也一样会被创建成功,只是没有size,所以不绘画任何东西(paints nothing),就像例子所用的方法那样,建议在调用ImageIcone构造函数前首先验证URL是否指向一个存在的文件路径 所以,你可以很简单的修改你的代码来验证上述说法
    @Override
    public void paint(Graphics g) {
        ImageIcon ii = new ImageIcon("xxxx/xxxx/xxx.jpg"); //看看是否创建了一个ImageIcon对象,且没有size
        System.out.printf("w=%d, h=%d\n", ii.getWidth(), ii.getHeight()); //用个真实有效的文件试试size是多少?不存在的文件size是多少?
        g.drawImage(ii.getImage(), 300, 300, null); //所以这里不会绘画任何东西
    }
以后遇到问题多看看文档
是的,以后养成看文档习惯。 一般,我判断异常,就是Run窗口有没有显示任何错误信息,比如1/0就会。或者改用这个类的方法也可以。 ImageIcon没有这个设计有点坑。

    @Override
    public void paint(Graphics g) {
        try {
            g.drawImage(ImageIO.read(new File("xxxx/xxxx/xx.jpg")), 300, 300, null);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
qybao 2020-07-27
  • 打赏
  • 举报
回复
引用 11 楼 qybao 的回复:
    @Override
public void paint(Graphics g) {
ImageIcon ii = new ImageIcon("xxxx/xxxx/xxx.jpg"); //看看是否创建了一个ImageIcon对象,且没有size
System.out.printf("w=%d, h=%d\n", ii.getWidth(), ii.getHeight()); //用个真实有效的文件试试size是多少?不存在的文件size是多少?
g.drawImage(ii.getImage(), 300, 300, null); //所以这里不会绘画任何东西
}


以后遇到问题多看看文档

上面笔误, ii.getWidth()改成ii.getIconWidth(), ii.getIconHeight
qybao 2020-07-27
  • 打赏
  • 举报
回复
引用 10 楼 qq_16774199 的回复:
你好,请看以下代码,给一条错误路径或图片名,结果不显示图片也不报错。
按理说此时应该产生运行时异常,道理应该同1/0类似。


import javax.swing.*;
import java.awt.*;

public class test extends JFrame {

test(){
this.setDefaultCloseOperation(3);
this.setSize(800, 600);
this.setLocation(300, 40);
}

@Override
public void paint(Graphics g) {
g.drawImage(new ImageIcon("xxxx/xxxx/xxx.jpg").getImage(), 300, 300, null);
}

public static void main(String[] args) {
new test().setVisible(true);
}
}


你怎么判断它出运行时异常了?
你好好查看java的文档
https://docs.oracle.com/javase/8/docs/api/javax/swing/ImageIcon.html
点击如何使用Icons的链接 see How to Use Icons in The Java Tutorial.
里面有段描述
When you specify a filename or URL to an ImageIcon constructor, processing is blocked until after the image data is completely loaded or the data location has proven to be invalid. If the data location is invalid (but non-null), an ImageIcon is still successfully created; it just has no size and, therefore, paints nothing. As shown in the createImageIcon method, it is advisable to first verify that the URL points to an existing file before passing it to the ImageIcon constructor. This allows graceful error handling when the file isn't present. If you want more information while the image is loading, you can register an observer on an image icon by calling its setImageObserver method.
如果location是无效的(只要是非null,哪怕是路径不存在也一样),ImageIcode对像也一样会被创建成功,只是没有size,所以不绘画任何东西(paints nothing),就像例子所用的方法那样,建议在调用ImageIcone构造函数前首先验证URL是否指向一个存在的文件路径

所以,你可以很简单的修改你的代码来验证上述说法

    @Override
public void paint(Graphics g) {
ImageIcon ii = new ImageIcon("xxxx/xxxx/xxx.jpg"); //看看是否创建了一个ImageIcon对象,且没有size
System.out.printf("w=%d, h=%d\n", ii.getWidth(), ii.getHeight()); //用个真实有效的文件试试size是多少?不存在的文件size是多少?
g.drawImage(ii.getImage(), 300, 300, null); //所以这里不会绘画任何东西
}


以后遇到问题多看看文档



SilentHunter460 2020-07-26
  • 打赏
  • 举报
回复
引用 8 楼 刘乐钢铁 的回复:
不会报错~也不会有图片
你好,是的,你明白我的意思了。 所以我觉得好奇怪,是不是因为这个方法没有抛异常功能,所以不报错也没图片? 那么1/0会报错是什么道理?
刘乐钢铁 2020-07-26
  • 打赏
  • 举报
回复
不会报错~也不会有图片
weixin_48005879 2020-07-26
  • 打赏
  • 举报
回复 1
java中对程序的运行可能出现的问题有两种类型: 1、错误,所有的Error都不是我们程序员能够解决的问题。 2、异常,异常分两类, 第一种就是“检查时异常”,检查异常也称之为一般异常,这些异常通常在编译期间需要由程序员做出处理,否则会出现编译错误,并且这种异常对写代码非常不友好。就是一个方法内部到写try catch, 要么方法名后面跟着 throws。而且方法调用的这个方法也要跟着抛异常,也就是throws。这类异常是Java特有的。常见的检查时异常: java.io.FileNotFoundException java.lang.ClassNotFoundException java.io.IOException java.lang.NoSuchMethodException 第二种异常,叫“运行时异常”所谓的运行时异常,即在程序编译期间不需要做任何处理,编译器能够正常编译通过,但是在运行期间由于一些人 为原因导致的异常。运行时异常中所有的类都是从java.lang.RuntimeException继承过来 常见的运行时异常: java.lang.ArithmeticException java.lang.NullPointerException java.lang.ClassCastException java.lang.ArrayIndexOutOfBoundsException java中所有的异常都是从java.lang.Exception继承而来 异常抛出即将程序编译或者运行期间(主要是检查异常,运行时异常不用处理)出现的异常通过方法向外抛,最终 可以抛出到main方法由java虚拟机解决(JVM会将异常的追溯信息在标准错误输出流输出),所以当你传的参数有问题,例如路径不对,,那个方法又没throws标识,那么就会抛出 运行时异常。 实际上只要是Java的原生方法又要求传路径参数的必然有throws标识。而以后基本上的异常都要自己处理,尽量避免方法后面有throws标识。
qybao 2020-07-25
  • 打赏
  • 举报
回复
你不抛出异常不代表程序运行没有异常,就像3L说的运行时异常 比如 int a=5,b=0 int c=a/b 虽然你不抛出异常,但是你运行代码就会出现除0异常 所以try catch本身不是取决于你抛不抛出异常,而是取决于是不是会发生异常,以及你有没有捕捉相应的异常
SilentHunter460 2020-07-25
  • 打赏
  • 举报
回复
引用 2 楼 qybao的回复:
不是 try catch能捕捉各种异常,关键看你有没有捕捉 因为异常不一定是IOExeption类型,所以你这样捕捉有局限 你可以试试catch Exeption或者catch Throwable
你好。我的理解是, 一个方法如果本身没有设计抛异常,你如何try catch?
医手 2020-07-25
  • 打赏
  • 举报
回复
java 的异常分两类,一类就是写代码的时候就看得到的异常。也就是你说的这种异常,我也不知这类异常叫什么名字。反正这种异常对写代码非常不友好。要么到处写try catch, 要么到处写throws。我是深恶痛绝的。这类异常是Java特有的。 还有一类异常,叫“运行时异常”这是其他语言和Java都有的。只会在运行时抛出,在写代码阶段不强制要求try catch。 所以当你传的参数有问题,例如路径不对,,那个方法又没throws标识,那么就会抛出 运行时异常。 实际上只要是Java的原生方法又要求传路径参数的必然有throws标识。而我写的任何方法都不会有throws标识。
qybao 2020-07-25
  • 打赏
  • 举报
回复
不是 try catch能捕捉各种异常,关键看你有没有捕捉 因为异常不一定是IOExeption类型,所以你这样捕捉有局限 你可以试试catch Exeption或者catch Throwable
nid 2020-07-25
  • 打赏
  • 举报
回复
是的,如果你调用的方法没有抛异常出来,你刻意写try catch 是没有用的。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧