老师以下是我对异常机制的一点个人总结劳烦斧正一下:
一:异常机制:
在程序编写中,往往会出现一些异常错误,主要有-编译错误(编写代码时就能被编辑器软件提示);运行时错误(编写时无异常在运行过程中出现的异常)异常机制主要针对于处理运行时异常RuntimeException
二:语法:try——catch——finally
2.1 try用于将可能出现异常的代码包裹起来用于及时将异常抛出
2.2 catch:捕获,用于根据try抛出的代码异常做出相应的解决办法,以维持程序不会应出现异常而中断
2.3 finally:将不论是否发生异常都必须要运行的代码放在里面,常见于io流的关闭--比如在拷贝文件时也许文件并不存在或空间不足这都是异常想要被处理但是光处理还不够还需要将流关闭,这时候就需要用到finally
2.4 注意:catch和finally不能单独使用,必须配合try一起使用;try可以有多个catch语句用于针对不同的异常做出不同的解决办法,但catch不能有多个try
老师,我Tomcat一打开就闪退,JDK环境变量配置之前就使用eclipse的时候就配了的,CATALINA和Path也配置好了,在startup文件里面加JDK和Tomcat的安装路径我也加了,你看能不能把JDK1.8的版本发我一下
老师,我想问一下为什么我网页上登录了,但是eclipse上没有反应是怎么回事?刚开始有时候还是会正常运行,到后面就一点反应都没了,我也没去动其它什么地方,有点懵。
这是eclipse上面的代码:
package cn.zl.server; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import cn.zl.client.CloseAll; public class Server3 { public static void main(String[] args) { //创建ServerSocket对象 ServerSocket server = null; InputStream is = null; Socket s = null; try { server = new ServerSocket(8888); //监听是否有客户端发送请求并获取Socket对象 s = server.accept(); is = s.getInputStream(); byte[] buf = new byte[20480]; int len = is.read(buf); System.out.println(new String(buf,0,len)); } catch (Exception e) { // TODO: handle exception }finally { //关闭流 CloseAll.closeAll(is,s,server); } } }
下面是记事本上面的代码:
<html> <head> <title>王者荣耀</title> </head> <body> <h1>欢迎来到旺仔农药</h1> <form action="http://localhost:8888/index.html" method="get"> <p>账号:<input type="text" id="uname" name="username"/></p> <p>密码:<input type="password" id="pwd" name="password"/></p> <p><input type="submit" value="登录"/></p> </form> </body> </html>
老师好,我运行了之后客户端收到的信息是乱码,这个怎么解决呢?
客户端代码:
package com.bjsxt.client; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; public class Test { public static void main(String[] args) throws IOException { //(1)创建Socket对象 Socket client = new Socket("127.0.0.1", 9999); //(2)获取输出流 OutputStream os = client.getOutputStream(); os.write('a'); //(3)获取输入流 InputStream is = client.getInputStream(); byte [] buf = new byte[1024]; int len=0;//读到的字节的个数 while ((len=is.read())!= -1){ System.out.println(new String(buf,0,len)); } //(4)关闭流 if (is!=null){ is.close(); } if(os!=null){ os.close(); } if (client!=null){ client.close(); } } }
服务端代码:
package com.bjsxt.server; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Test { public static void main(String[] args) throws IOException { System.out.println("----------服务器端已启动-----------"); //(1)创建ServerSocket对象 ServerSocket server = new ServerSocket(9999); //(2)监听是否有客户端来请求连接 Socket client = server.accept(); //(3)获取输入流 InputStream is = client.getInputStream(); System.out.println((char) is.read()); //(4)获取输出流 OutputStream os = client.getOutputStream(); os.write("收到了!".getBytes()); //(5)关闭流,关闭Socket if (os!=null){ os.close(); } if (is!=null){ is.close(); } if (client!=null){ client.close(); } } }
运行结果:
老师,我想问一下当线程池里面有1个以上的线程同时运行时,这里Runnable任务的运行结果的顺序是不是就肯定不能保证。有没有方法可以让运行速度变快,又能让结果是按顺序显示的。
老师,为什么我用谷歌浏览器,返回值一直是-1,服务器报错;换成ie浏览器就可以
老师帮我看看注释部分我理解的对吗
public static byte[] write(){ ByteArrayOutputStream bos=null; //将任意的数据类型都转为字节类型 DataOutputStream dos=null; try{ //创建字节数组流对象,目的地是字节数组,底层创建一个长度数为32的字节数组 //ByteArrayOutputStream的作用就是在内存中创建一个byte数组存储写入的数据 bos=new ByteArrayOutputStream(); //数据处理流,往数组内写入指定类型的数据并转化为byte类型存储到数组中 dos=new DataOutputStream(bos); dos.writeBoolean(true); dos.writeInt(98); dos.writeChar('c'); dos.writeDouble(99.9); }catch (IOException e){ e.printStackTrace(); }finally { try{ if(dos!=null){ dos.close(); } }catch (IOException e){ e.printStackTrace(); } } //返回该数组 return bos.toByteArray(); }
老师你好请问该视频的解决思路是什么呢?
因为我有想到用同步代码块去将生产者类的奇数和偶数情况下的打印用同步代码块监控起来:
想着,让奇数执行完才能执行偶数的想法
但运行结果还是数据错乱
然后我可能有点病急乱投医发现没有效果之后就又将消费者类用代码块监控起来,情况会好一点但还是数据错乱
然后看视频敲代码,是将set和get方法监控起来实现的线程同步,请问它的逻辑是什么?
是因为生产者和消费者都调用goods类所以直接将他们共同调用的监控起来实现同步吗?
老师请问为什么我的运行结果是只显示一个生产者线程呢?而且运行10次有9次都是在最后一个打印出来
老师,这集视频可否总结为:在线程中不能一个锁里套另一个锁,要让锁称为并列关系而不是嵌套关系。
说实话对于视频的有水等钱有钱等水还是有点懵逼,也不明白为什么要设置flag一个为true一个为false的用意所在。
还有就是为什么d1线程为true执行完d2为false执行会才能死锁,而把d2的flag设置为true时就不会出现死锁呢?
问题描述:老师,我在手写LinkeList的时候,add(index,element)无法插入,代码检查也没有什么问题,能帮忙分析一下么?代码如下
package com.test.Homework; import com.test.Node; import java.util.LinkedList; public class MyLinkedList<E> { private MyNode first; private MyNode last; private int size; public static void main(String[] args) { MyLinkedList<String> ss = new MyLinkedList<String>(); ss.add("a"); ss.add("b"); ss.add("c"); ss.add("d"); ss.add("e"); ss.add("f"); ss.add("g"); System.out.println(ss); ss.remove(0); System.out.println(ss.get(0)); ss.add(2,"jk"); System.out.println(ss); } @Override public String toString() { StringBuilder str = new StringBuilder("["); MyNode temp = first; while (temp!=null){ str.append(temp.element+","); temp = temp.next; } str.setCharAt(str.length()-1,']'); return str.toString(); } private void checkRange(int index){//为了保证程序健壮性 if (index<0||index>size-1){ throw new RuntimeException("索引不合法:" + index); } } public MyNode getNode(int index){//通过索引获得数据信息 MyNode temp = null; if(index<=(size>>1)){ temp=first; for(int i=0;i<index;i++){ temp = temp.next; } }else{ temp = last; for(int i=size-1;i>index;i--){ temp = temp.previous; } } return temp; } public E get(int index){//通过index获取数据域,与getNode 功能一样 checkRange(index); MyNode temp = getNode(index); System.out.println(temp); return temp!=null? (E)temp.element:null; } public void add(E element){//仅添加数据 MyNode node = new MyNode(element); if(first==null){//第一次放数据 node.previous = first; node.next = null; first=node; last=node; }else{ node.previous=first; node.next=null; last.next=node; last=node; } } /**public void add(int index, E element) { if(size<=index){ add(element); return; } MyNode pNode = getNode(index);// 插入节点 MyNode preNode = pNode.previous; // 插入节点的前驱节点 MyNode newNode = new MyNode();// 新节点 newNode.previous=preNode;// 首先, 新节点的前驱指向插入节点的前驱节点 newNode.next = pNode;// 其次, 新节点的后继指向插入节点 pNode.previous = newNode;// 然后, 插入节点的前驱指向新节点 preNode.next = newNode;// 最后, 插入节点的前驱结点的后继指向新节点 newNode.element = element;// 节点的数据域赋值 if (index == 0) first = newNode; if(size ==index) last = newNode; size++; }*/ public void add(int index,E element){ checkRange(index); MyNode newNode = new MyNode(element); MyNode temp = getNode(index); if(temp!=null){ MyNode up = temp.previous; up.next = newNode; newNode.previous = up; newNode.next = temp; temp.previous = newNode; } } public void remove(int index){//删除方法 checkRange(index); MyNode temp = getNode(index); if(temp!=null){ MyNode up = temp.previous; MyNode down = temp.next; if(up!=null){ up.next=down; } if(down!=null){ down.previous=up; } if(index==0){ first=down; } if(index==size-1){ last=up; } size--; } } } class MyNode{//创建一个节点类 MyNode previous;//前驱 MyNode next;//后续 Object element;//数据域 public MyNode() { this.previous = previous; this.next = next; this.element = element; } public MyNode(Object element){ this.element=element; } }
老师,这个-128~127范围内,怎么直接赋值?
老师这个writeUTF()方法是什么意思
dos.writeUTF("helloWord");
一:老师,我的作业不会做,有没有像阶段一那样,每个作业都有专门的视频讲解,我可以跟着讲解写代码,百度上面的代码发现抄下来也看不懂,完全小白一枚,请老师多多指教!
老师我想问下既然读取到字节流已经转成字符流了,那为什么输出的时候不直接使用new BufferedWriter(new FileWriter(”C:\\users\\chenkai\\desktop\\JavaDemo\\c.txt“))
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter (new FileOutputStream("C:\\Users\\chenkai\\Desktop\\JavaDemo \\c.txt"),"gbk"
非常抱歉给您带来不好的体验!为了更深入的了解您的学习情况以及遇到的问题,您可以直接拨打投诉热线:
我们将在第一时间处理好您的问题!
关于
课程分类
百战程序员微信公众号
百战程序员微信小程序
©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园网站维护:百战汇智(北京)科技有限公司 京公网安备 11011402011233号 京ICP备18060230号-3 营业执照 经营许可证:京B2-20212637