abstract class A { ... public abstract void b(); // note: 这里没有“{}”了 ... }
public interface Runner { public static final int id = 1; // 常量前要加“public static final”关键字 public void start(); // interface内的抽象方法不需要加abstract关键字 public void run(); public void stop(); }
这是为了避免像C++多继承那样多个父类有同名成员变量而出现的冲突。
以接口引用实现类的对象,就只能调用本接口声明了的方法和属性。
<modifier> class <name> [extends <superclass>] [implements <interface> [, <interface>]*] { <declarations>* }
程序,是调出来的。
public class TestEx { public static void main(String[] args) { int[] arr = {1, 2, 3}; System.out.println(arr[4]); // 与Java不同,在C/C++中并不检查数组越界 } } /* 输出: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4 at TestEx.main(TestEx.java:6) */
import java.io.*; public class TestEx { public static void main(String[] args) { TestEx te = new TestEx(); te.m(0); // 对RuntimeException不做处理有虚拟机缺省处理,编译可以通过,但运行时缺省处理报异常后就停止不往下执行了 // te.n(0); // 而对非RuntimeException必须try/catch或声明,否则编译报错 /* 编译报错 TestEx.java:27: 未报告的异常 java.io.IOException;必须对其进行捕捉或声明以便抛出 te.n(0); ^ */ try { te.n(0); } catch(IOException e) { // 将try{}中抛出的某错误类的对象捕获传给引用e System.out.println("出错了!"); e.printStackTrace(); // 跟踪异常事件发生时执行堆栈的内容,并在控制台上打印出来,包含了getMessage()。 } /* 输出: 出错了! java.io.IOException: 而对非RuntimeException必须try/catch或声明,否则编译报错 at TestEx.n(TestEx.java:39) at TestEx.main(TestEx.java:22) 程序执行完毕 */ System.out.println("程序执行完毕"); } // 方法内创建异常类对象并抛出,注意语法 void m(int i) throws RuntimeException { // throws--声明异常 if(0 == i) throw new RuntimeException("对RuntimeException不做处理有虚拟机缺省处理,编译可以通过,但运行时缺省处理报异常后就停止不往下执行了"); } // note:如果throw语句后面方法内还有语句,当抛出异常时该方法内剩余的语句就不执行了 void n(int i) throws IOException { // IOException不属于RuntimeException if(0 == i) throw new IOException("而对非RuntimeException必须try/catch或声明,否则编译报错"); } }
import java.io.*; public class TestEx { public static void main(String[] args) { // 用try/catch结构体捕捉处理异常,之后程序会继续往下执行,注意语法 FileInputStream is = null; try { // try代码段包含可能产生异常的代码,注意!最小包含原则 is = new FileInputStream("myfile.txt"); int b; b = is.read(); while (b != 1) { System.out.print((char) b); b = is.read(); } // 当异常发生时,程序会终止当前的流程,根据获取异常的类型去执行相应的catch段 } catch(FileNotFoundException e) { // catch代码段声明其能处理的某一类异常 e.printStackTrace(); // 并在段内提供处理的方法 } catch(IOException e) { // 对try中抛出的多类异常,分别catch处理 System.out.println(e.getMessage()); // getMessage()方法用来得到异常事件的信息。较少用 } finally { // finally段的代码无论是否发生异常都要执行 try { is.close(); } catch(Exception e) { e.printStackTrace(); } } System.out.println("程序执行完毕"); } }
import java.io.*; public class TestEx { public static void main(String[] args) { TestEx te = new TestEx(); // f()方法抛出的异常最终"上交"给main()方法处理了 // 当然main()方法也可以向外声明(throws)上交给虚拟机处理,但这是错误的 // 应当尽力将异常处理在自家门里 try { te.ff(); } catch(IOException e) { System.out.println("f()方法抛出的异常最后\"上交\"给main()方法处理了"); e.printStackTrace(); } } // 声明方法抛出的异常 void f(boolean b) throws FileNotFoundException, IOException { // 尽管FileNotFoundException是IOException的子类,可以只throws IOException,但作为一种意识还是强烈建议分开抛 if(b) throw new FileNotFoundException("声明方法抛出的异常A"); else throw new IOException("声明方法抛出的异常B"); } void ff() throws IOException { // 对调用的方法所抛出的异常处理不了的也可以继续向外抛出 f(true); } }
通过继承 java.lang.Exception(或RuntimeException) 类声明自己的异常类;然后用法跟普通异常一样。
class MyException extends Exception { private int id; public MyException(String message, int id) { super(message); this.id = id; } public int getId() { return id; } }
note:重写方法只能抛出与原方法所抛出一样类型(不包括父类、子类)的异常,要么不抛出异常。