问题描述
在学习Java多线程的过程中 在编写线程类
实现runnbable接口重写run方法的时候 当run方法里面书写的代码需要对异常进行处理的话 学习资料中老师直接将异常进行捕获处理 之前写的代码处理异常时抛出异常的操作偏多 所以我在思考能不能抛出异常?经过查阅资料和查看源码 答案是:不能
package com.itheima.a13test7;
import java.io.*;
import java.net.Socket;
import java.util.UUID;
public class MyRunnable implements Runnable{
Socket socket;
public MyRunnable(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try {
//创建缓冲输出流对象
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
//获取图片的随机ID
String name = UUID.randomUUID().toString().replace("-", "");
//从通道中获得字节输出流对象 并通过缓冲流包装创建缓冲输入流对象
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\servedir\\"+name+".jpg"));
//因为要采用缓冲输入流中参数为字节数据的读取方法 所以要创建一个字节数组
byte[] bytes = new byte[1024];
int len;
//读取数据
while((len = bis.read(bytes))!=-1){
//一边读取 一边写入
bos.write(bytes,0,len);
bos.flush();
}
bos.close();
//回写数据
//从通道中获得输出流对象 为了提高读写速度 将其包装为字符缓冲输入流 因为不是读取文件
//而且输入的又只是一句话 所以用缓冲字符流就好了 而且字符缓冲流特有的方法有一个换行的方法
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bw.write("上传成功!");
bw.newLine();
bw.flush();
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
}
原因分析:
当实现
Runnable
接口并重写run
方法时,不能直接在run
方法的签名中抛出异常(即throws
语句)。因为Runnable.run
方法在其接口定义中没有声明任何异常,因此重写方法时也不能声明抛出异常。相应地,需要在run
方法内部捕获并处理可能出现的异常。