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也是沒有作用,對吧?
uj5u.com熱心網友回復:
是的,如果你呼叫的方法沒有拋例外出來,你刻意寫try catch 是沒有用的。uj5u.com熱心網友回復:
不是try catch能捕捉各種例外,關鍵看你有沒有捕捉
因為例外不一定是IOExeption型別,所以你這樣捕捉有局限
你可以試試catch Exeption或者catch Throwable
uj5u.com熱心網友回復:
java 的例外分兩類,一類就是寫代碼的時候就看得到的例外。也就是你說的這種例外,我也不知這類例外叫什么名字。反正這種例外對寫代碼非常不友好。要么到處寫try catch, 要么到處寫throws。我是深惡痛絕的。這類例外是Java特有的。還有一類例外,叫“運行時例外”這是其他語言和Java都有的。只會在運行時拋出,在寫代碼階段不強制要求try catch。
所以當你傳的引數有問題,例如路徑不對,,那個方法又沒throws標識,那么就會拋出 運行時例外。
實際上只要是Java的原生方法又要求傳路徑引數的必然有throws標識。而我寫的任何方法都不會有throws標識。
uj5u.com熱心網友回復:
你好。我的理解是,
一個方法如果本身沒有設計拋例外,你如何try catch?
uj5u.com熱心網友回復:
你不拋出例外不代表程式運行沒有例外,就像3L說的運行時例外比如
int a=5,b=0
int c=a/b
雖然你不拋出例外,但是你運行代碼就會出現除0例外
所以try catch本身不是取決于你拋不拋出例外,而是取決于是不是會發生例外,以及你有沒有捕捉相應的例外
uj5u.com熱心網友回復:
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標識。
uj5u.com熱心網友回復:
不會報錯~也不會有圖片uj5u.com熱心網友回復:
你好,是的,你明白我的意思了。
所以我覺得好奇怪,是不是因為這個方法沒有拋例外功能,所以不報錯也沒圖片?
那么1/0會報錯是什么道理?
uj5u.com熱心網友回復:
你好,請看以下代碼,給一條錯誤路徑或圖片名,結果不顯示圖片也不報錯。
按理說此時應該產生運行時例外,道理應該同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);
}
}
uj5u.com熱心網友回復:
你怎么判斷它出運行時例外了?
你好好查看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); //所以這里不會繪畫任何東西
}
以后遇到問題多看看檔案
uj5u.com熱心網友回復:
上面筆誤, ii.getWidth()改成ii.getIconWidth(), ii.getIconHeight
uj5u.com熱心網友回復:
