深入学习java源码之Byte.decode()与Byte.toUnsignedInt()

2023-11-11

深入学习java源码之Byte.decode()与Byte.toUnsignedInt()

异常

异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域的情况,称之为异常。

其中Error类中包括虚拟机错误和线程死锁,一旦Error出现了,程序就彻底的挂了,被称为程序终结者;

Exception类,也就是通常所说的“异常”。主要指编码、环境、用户操作输入出现问题,Exception主要包括两大类,非检查异常(RuntimeException)和检查异常(其他的一些异常)

RuntimeException异常主要包括以下四种异常(其实还有很多其他异常,这里不一一列出):空指针异常、数组下标越界异常、类型转换异常、算术异常。RuntimeException异常会由java虚拟机自动抛出并自动捕获(就算我们没写异常捕获语句运行时也会抛出错误!!),此类异常的出现绝大数情况是代码本身有问题应该从逻辑上去解决并改进代码。

检查异常,引起该异常的原因多种多样,比如说文件不存在、或者是连接错误等等。跟它的“兄弟”RuntimeException运行异常不同,该异常我们必须手动在代码里添加捕获语句来处理该异常,这也是我们学习java异常语句中主要处理的异常对象。

1. Throwable
  Throwable是 Java 语言中所有错误或异常的超类。
  Throwable包含两个子类: Error 和 Exception。它们通常用于指示发生了异常情况。
  Throwable包含了其线程创建时线程执行堆栈的快照,它提供了printStackTrace()等接口用于获取堆栈跟踪数据等信息。

2. Exception
  Exception及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。

3. RuntimeException 
  RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。
  编译器不会检查RuntimeException异常。例如,除数为零时,抛出ArithmeticException异常。RuntimeException是ArithmeticException的超类。当代码发生除数为零的情况时,倘若既"没有通过throws声明抛出ArithmeticException异常",也"没有通过try...catch...处理该异常",也能通过编译。这就是我们所说的"编译器不会检查RuntimeException异常"!
  如果代码会产生RuntimeException异常,则需要通过修改代码进行避免。例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生!

4. Error
  和Exception一样,Error也是Throwable的子类。它用于指示合理的应用程序不应该试图捕获的严重问题,大多数这样的错误都是异常条件。
  和RuntimeException一样,编译器也不会检查Error。

package java.lang;

public class Error extends Throwable {
    static final long serialVersionUID = 4980196508277280342L;

    public Error() {
        super();
    }

    public Error(String message) {
        super(message);
    }

    public Error(String message, Throwable cause) {
        super(message, cause);
    }

    public Error(Throwable cause) {
        super(cause);
    }

    protected Error(String message, Throwable cause,
                    boolean enableSuppression,
                    boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

Java将可抛出(Throwable)的结构分为三种类型:被检查的异常(Checked Exception),运行时异常(RuntimeException)和错误(Error)。

(01) 运行时异常
定义: RuntimeException及其子类都被称为运行时异常。
特点: Java编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用try-catch语句捕获它",还是会编译通过。例如,除数为零时产生的ArithmeticException异常,数组越界时产生的IndexOutOfBoundsException异常,fail-fail机制产生的ConcurrentModificationException异常等,都属于运行时异常。
  虽然Java编译器不会检查运行时异常,但是我们也可以通过throws进行声明抛出,也可以通过try-catch对它进行捕获处理。
  如果产生运行时异常,则需要通过修改代码来进行避免。例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生!

(02) 被检查的异常
定义: Exception类本身,以及Exception的子类中除了"运行时异常"之外的其它子类都属于被检查异常。
特点: Java编译器会检查它。此类异常,要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。例如,CloneNotSupportedException就属于被检查异常。当通过clone()接口去克隆一个对象,而该对象对应的类没有实现Cloneable接口,就会抛出CloneNotSupportedException异常。
  被检查异常通常都是可以恢复的。

(03) 错误
定义: Error类及其子类。
特点: 和运行时异常一样,编译器也不会对错误进行检查。
  当资源不足、约束失败、或是其它程序无法继续运行的条件发生时,就产生错误。程序本身无法修复这些错误的。例如,VirtualMachineError就属于错误。
  按照Java惯例,我们是不应该是实现任何新的Error子类的!

对于上面的3种结构,我们在抛出异常或错误时,到底该哪一种?《Effective Java》中给出的建议是:对于可以恢复的条件使用被检查异常,对于程序错误使用运行时异常。

 

(1)try块:负责捕获异常,一旦try中发现异常,程序的控制权将被移交给catch块中的异常处理程序。
  【try语句块不可以独立存在,必须与 catch 或者 finally 块同存】

(2)catch块:如何处理?比如发出警告:提示、检查配置、网络连接,记录错误等。执行完catch块之后程序跳出catch块,继续执行后面的代码。
    【编写catch块的注意事项:多个catch块处理的异常类,要按照先catch子类后catch父类的处理方式,因为会【就近处理】异常(由上自下)。】

(3)finally:最终执行的代码,用于关闭和释放资源。

     public int test1(){
         int divider=10;
         int result=100;
         try{
             while(divider>-1){
                 divider--;
                result=result+100/divider;
             }
             return result;
        }catch(Exception e){
             e.printStackTrace();
             System.out.println("异常抛出了!!");
             return -1;
         }finally{
             System.out.println("这是finally,哈哈哈!!");
             System.out.println("result的值为:"+result);
         }
     }

抛出的异常信息是由e.printStackTrace()来输出的,它说明了这里我们抛出的异常类型是算数异常,后面还跟着原因:by zero(由0造成的算数异常),下面两行at表明了造成此异常的代码具体位置。
finally语句块是在try块和catch块语句执行之后最后执行的。finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的
finally块中的return语句可能会覆盖try块、catch块中的return语句;如果finally块中包含了return语句,即使前面的catch块重新抛出了异常,则调用该方法的语句也不会获得catch块重新抛出的异常,而是会得到finally块的返回值,并且不会捕获异常。

解决问题:面对上述情况,其实更合理的做法是,既不在try block内部中使用return语句,也不在finally内部使用 return语句,而应该在 finally 语句之后使用return来表示函数的结束和返回。

总结:

  1、不管有木有出现异常或者try和catch中有返回值return,finally块中代码都会执行;

  2、finally中最好不要包含return,否则程序会提前退出,返回会覆盖try或catch中保存的返回值。

  3.  e.printStackTrace()可以输出异常信息。

  4.  return值为-1为抛出异常的习惯写法。

  5.  如果方法中try,catch,finally中没有返回语句,则会调用这三个语句块之外的return结果。

  6.  finally 在try中的return之后 在返回主调函数之前执行。

java中的异常抛出通常使用throw和throws关键字来实现。

throw ----将产生的异常抛出,是抛出异常的一个动作。

一般会用于程序出现某种逻辑时程序员主动抛出某种特定类型的异常。如:
  语法:throw (异常对象),如:

 public static void main(String[] args) { 
     String s = "abc"; 
     if(s.equals("abc")) { 
       throw new NumberFormatException(); 
     } else { 
       System.out.println(s); 
     } 
     //function(); 
 } 

throws----声明将要抛出何种类型的异常(声明)。

 public void 方法名(参数列表)
    throws 异常列表{
 //调用会抛出异常的方法或者:
 throw new Exception();
 } 

当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理。如:

   public static void function() throws NumberFormatException{ 
      String s = "abc"; 
      System.out.println(Double.parseDouble(s)); 
    } 
      
    public static void main(String[] args) { 
      try { 
        function(); 
      } catch (NumberFormatException e) { 
       System.err.println("非数据类型不能转换。"); 
       //e.printStackTrace(); 
     } 
 } 

 throw与throws的比较
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

来看个例子:

throws e1,e2,e3只是告诉程序这个方法可能会抛出这些异常,方法的调用者可能要处理这些异常,而这些异常e1,e2,e3可能是该函数体产生的。
throw则是明确了这个地方要抛出这个异常。如:

  void doA(int a) throws (Exception1,Exception2,Exception3){
        try{
           ......
   
        }catch(Exception1 e){
         throw e;
        }catch(Exception2 e){
         System.out.println("出错了!");
        }
       if(a!=b)
        throw new Exception3("自定义异常");
 }

分析:
1.代码块中可能会产生3个异常,(Exception1,Exception2,Exception3)。
2.如果产生Exception1异常,则捕获之后再抛出,由该方法的调用者去处理。
3.如果产生Exception2异常,则该方法自己处理了(即System.out.println("出错了!");)。所以该方法就不会再向外抛出Exception2异常了,void doA() throws Exception1,Exception3 里面的Exception2也就不用写了。因为已经用try-catch语句捕获并处理了。
4.Exception3异常是该方法的某段逻辑出错,程序员自己做了处理,在该段逻辑错误的情况下抛出异常Exception3,则该方法的调用者也要处理此异常。
使用throw和throws关键字需要注意以下几点:

1.throws的异常列表可以是抛出一条异常,也可以是抛出多条异常,每个类型的异常中间用逗号隔开

2.方法体中调用会抛出异常的方法或者是先抛出一个异常:用throw new Exception() throw写在方法体里,表示“抛出异常”这个动作。

3.如果某个方法调用了抛出异常的方法,那么必须添加try catch语句去尝试捕获这种异常, 或者添加声明,将异常抛出给更上一层的调用者进行处理

 

自定义异常

1.我们在工作的时候,项目是分模块或者分功能开发的 ,基本不会你一个人开发一整个项目,使用自定义异常类就统一了对外异常展示的方式。
2.有时候我们遇到某些校验或者问题时,需要直接结束掉当前的请求,这时便可以通过抛出自定义异常来结束,如果你项目中使用了SpringMVC比较新的版本的话有控制器增强,可以通过@ControllerAdvice注解写一个控制器增强类来拦截自定义的异常并响应给前端相应的信息。
3.自定义异常可以在我们项目中某些特殊的业务逻辑时抛出异常,比如"中性".equals(sex),性别等于中性时我们要抛出异常,而Java是不会有这种异常的。系统中有些错误是符合Java语法的,但不符合我们项目的业务逻辑。
4.使用自定义异常继承相关的异常来抛出处理后的异常信息可以隐藏底层的异常,这样更安全,异常信息也更加的直观。自定义异常可以抛出我们自己想要抛出的信息,可以通过抛出的信息区分异常发生的位置,根据异常名我们就可以知道哪里有异常,根据异常提示信息进行程序修改。比如空指针异常NullPointException,我们可以抛出信息为“xxx为空”定位异常位置,而不用输出堆栈信息。
说完了为什么要使用自定义异常,有什么好处,我们再来看看自定义异常的毛病:
毋庸置疑,我们不可能期待JVM(Java虚拟机)自动抛出一个自定义异常,也不能够期待JVM会自动处理一个自定义异常。发现异常、抛出异常以及处理异常的工作必须靠编程人员在代码中利用异常处理机制自己完成。这样就相应的增加了一些开发成本和工作量,所以项目没必要的话,也不一定非得要用上自定义异常,要能够自己去权衡。
最后,我们来看看怎么使用自定义异常:

在 Java 中你可以自定义异常。编写自己的异常类时需要记住下面的几点。
所有异常都必须是 Throwable 的子类。
如果希望写一个检查性异常类,则需要继承 Exception 类。
如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
可以像下面这样定义自己的异常类:

  public class MyException extends Exception {
       /**
       * 错误编码
       */
      private String errorCode;
  
     
     public MyException(){}
     
     /**
      * 构造一个基本异常.
      *
      * @param message
      *        信息描述
      */
     public MyException(String message)
     {
         super(message);
     }

     public String getErrorCode() {
         return errorCode;
     }
 
     public void setErrorCode(String errorCode) {
         this.errorCode = errorCode;
     }
 }
  public class Main {
     public static void main(String[] args) {
          // TODO Auto-generated method stub
          String[] sexs = {"男性","女性","中性"};
                    for(int i = 0; i < sexs.length; i++){
                        if("中性".equals(sexs[i])){
                           try {
                             throw new MyException("不存在中性的人!");
                         } catch (MyException e) {
                             // TODO Auto-generated catch block
                             e.printStackTrace();
                         }
                      }else{
                          System.out.println(sexs[i]);
                      }
                 } 
     }
  }

自定义异常

public class CnException extends RuntimeException {
	private static final long serialVersionUID = -1433777525759711883L;

	public CnException(Object context, String code, String msg) {
		this.code = code;
		this.msg = msg;
		this.context = context;
	}

	public CnException(Object context, String code, String msg, Exception exe) {
		this.code = code;
		this.msg = msg;
		this.context = context;
		this.exe = exe;
	}

	private Object context;
	private String code;
	private String msg;
	private Exception exe;

	public Object getContext() {
		return context;
	}

	public void setContext(Object context) {
		this.context = context;
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public Exception getExe() {
		return exe;
	}

	public void setExe(Exception exe) {
		this.exe = exe;
	}
}
	public List<JsonModel> getQuery() {
		if (query == null && querystr != null) {
			try {
				query = JSONArray.parseArray(querystr, JsonModel.class);
			} catch (Exception e) {
				throw new CnException(query, "数据转换异常", e.getStackTrace().toString(), e);
			}
		}
		return query;
	}

自定义异常

import java.io.PrintWriter;
import java.io.StringWriter;


public class CoreException extends RuntimeException {

    /** 类版本标识 */
    private static final long serialVersionUID = 1L;

    /**
     * 构造带指定详细消息的新异常
     * @param msg 详细消息
     */
    public CoreException(String msg) {
        super(msg);
    }

    /**
     * 构造带指定详细消息和例外的新异常
     * @param msg 详细消息
     * @param e 例外
     */
    public CoreException(String msg, Exception e) {
        super(msg, e);
    }

    /**
     * 构造指定例外的新异常
     * @param e 例外
     */
    public CoreException(Throwable e) {
        super(e);
    }

    /**
     * 获取控制台报错信息
     * @param e
     * @return 报错信息
     */
    public static String getStackTraceMsg(Throwable e) {
        StringWriter sw = new StringWriter();
        e.printStackTrace(new PrintWriter(sw));
        return sw.toString();
    }

    /**
     * 获取根例外报错信息
     * @param t
     * @return Throwable
     */
    public static Throwable getRootCause(Throwable t) {
        Throwable t2 = t.getCause();
        while (t2 != null) {
            if (t2.getCause() != null) {
                t2 = t2.getCause();
            } else {
                break;
            }
        }
        return t2 != null ? t2 : t;
    }
}
import com.platform.core.exception.CoreException;
//接口
public IBean deepClone() throws CoreException;
//实现类
    public Bean deepClone() throws CoreException {
        Bean rtnObj = null;
        ByteArrayOutputStream byteOut = null;
        ObjectInputStream ois = null;
        ObjectOutputStream oos = null;
        ByteArrayInputStream bi = null;

        try {
            byteOut = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(byteOut);
            oos.writeObject(this);

            bi = new ByteArrayInputStream(byteOut.toByteArray());
            ois = new ObjectInputStream(bi);
            rtnObj = (Bean) ois.readObject();
        } catch (Exception e) {
            throw new CoreException(e.getCause());
        } finally {
            try {
                if (ois != null) {
                    ois.close();
                }
                if (bi != null) {
                    bi.close();
                }
                if (oos != null) {
                    oos.close();
                }
                if (byteOut != null) {
                    byteOut.close();
                }
            } catch (final IOException e) {
                e.printStackTrace();
            }
        }
        return rtnObj;
    }

 

异常需要封装,但是仅仅封装还是不够的,还需要传递异常。
异常链是一种面向对象编程技术,指将捕获的异常包装进一个新的异常中并重新抛出的异常处理方式。原异常被保存为新异常的一个属性(比如cause)。这样做的意义是一个方法应该抛出定义在相同的抽象层次上的异常,但不会丢弃更低层次的信息。

我可以这样理解异常链:
把捕获的异常包装成新的异常,在新异常里添加原始的异常,并将新异常抛出,它们就像是链式反应一样,一个导致(cause)另一个。这样在最后的顶层抛出的异常信息就包括了最底层的异常信息。

场景
比如我们的JEE项目一般都又三层:持久层、逻辑层、展现层,持久层负责与数据库交互,逻辑层负责业务逻辑的实现,展现层负责UI数据的处理。

有这样一个模块:用户第一次访问的时候,需要持久层从user.xml中读取数据,如果该文件不存在则提示用户创建之,那问题就来了:如果我们直接把持久层的异常FileNotFoundException抛弃掉,逻辑层根本无从得知发生任何事情,也就不能为展现层提供一个友好的处理结果,最终倒霉的就是展现层:没有办法提供异常信息,只能告诉用户“出错了,我也不知道出了什么错了”—毫无友好性而言。
正确的做法是先封装,然后传递,过程如下:

 1.把FileNotFoundException封装为MyException。
  2.抛出到逻辑层,逻辑层根据异常代码(或者自定义的异常类型)确定后续处理逻辑,然后抛出到展现层。
  3.展现层自行确定展现什么,如果管理员则可以展现低层级的异常,如果是普通用户则展示封装后的异常。

public void test1() throws RuntimeException{
          String[] sexs = {"男性","女性","中性"};
          for(int i = 0; i < sexs.length; i++){
              if("中性".equals(sexs[i])){
                  try {
                      throw new MyException("不存在中性的人!");
                 } catch (MyException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                     RuntimeException rte=new RuntimeException(e);//包装成RuntimeException异常
                     //rte.initCause(e);
                    throw rte;//抛出包装后的新的异常
                 }
            }else{
                System.out.println(sexs[i]);
            }
       } 
     }
     public static void main(String[] args) {
         // TODO Auto-generated method stub
         Main m =new Main();
         
         try{
         m.test1();
         }catch (Exception e){
             e.printStackTrace();
             e.getCause();//获得原始异常
         } 
     }

结果分析:我们可以看到控制台先是输出了原始异常,这是由e.getCause()输出的;然后输出了e.printStackTrace(),在这里可以看到Caused by:原始异常和e.getCause()输出的一致。这样就是形成一个异常链。initCause()的作用是包装原始的异常,当想要知道底层发生了什么异常的时候调用getCause()就能获得原始异常。 
建议
异常需要封装和传递,我们在进行系统开发的时候,不要“吞噬”异常,也不要“赤裸裸”的抛出异常,封装后在抛出,或者通过异常链传递,可以达到系统更健壮、友好的目的。

良好的编码习惯:

1、处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
2、在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常
3、对于不确定的代码,也可以加上try-catch,处理潜在的异常
4、尽量去处理异常,切记只是简单的调用printStackTrace()去打印
5、具体如何处理异常,要根据不同的业务需求和异常类型去决定
6、尽量添加finally语句块去释放占用的资源

 

方法

Modifier and Type Method and Description
byte byteValue()

Byte的值作为 byte

static int compare(byte x, byte y)

数值比较两个 byte值。

int compareTo(Byte anotherByte)

数字比较两个 Byte对象。

static Byte decode(String nm)

String解码成 Byte

double doubleValue()

返回此值 Bytedouble一个宽元转换后。

boolean equals(Object obj)

将此对象与指定的对象进行比较。

float floatValue()

返回此值 Bytefloat一个宽元转换后。

int hashCode()

返回这个Byte的哈希码; 等于调用intValue()的结果。

static int hashCode(byte value)

返回一个byte值的哈希码; 兼容Byte.hashCode()

int intValue()

返回此的值 Byte作为 int加宽原始转换之后。

long longValue()

返回此值 Bytelong一个宽元转换后。

static byte parseByte(String s)

将字符串参数解析为带符号的十进制 byte

static byte parseByte(String s, int radix)

将字符串参数解析为第二个参数指定的基数中的带符号的 byte

short shortValue()

返回此值 Byteshort一个宽元转换后。

String toString()

返回一个 String对象,代表这个 Byte的值。

static String toString(byte b)

返回一个新的 String对象,代表指定的 byte

static int toUnsignedInt(byte x)

的参数的转换 int由无符号转换。

static long toUnsignedLong(byte x)

参数给转换 long由无符号转换。

static Byte valueOf(byte b)

返回一个 Byte指定的 byte值的 Byte实例。

static Byte valueOf(String s)

返回一个 Byte物体保持由指定的给定的值 String

static Byte valueOf(String s, int radix)

返回一个 Byte对象,该对象保存从指定的String中 String的值,并使用第二个参数给出的基数进行解析。

java源码

package java.lang;

public final class Byte extends Number implements Comparable<Byte> {

   public static final byte   MIN_VALUE = -128;

   public static final byte   MAX_VALUE = 127;   
   
    @SuppressWarnings("unchecked")
    public static final Class<Byte>     TYPE = (Class<Byte>) Class.getPrimitiveClass("byte");

    public static String toString(byte b) {
        return Integer.toString((int)b, 10);
    }

    private static class ByteCache {
        private ByteCache(){}

        static final Byte cache[] = new Byte[-(-128) + 127 + 1];

        static {
            for(int i = 0; i < cache.length; i++)
                cache[i] = new Byte((byte)(i - 128));
        }
    }

    public static Byte valueOf(byte b) {
        final int offset = 128;
        return ByteCache.cache[(int)b + offset];
    }	

    public static byte parseByte(String s, int radix)
        throws NumberFormatException {
        int i = Integer.parseInt(s, radix);
        if (i < MIN_VALUE || i > MAX_VALUE)
            throw new NumberFormatException(
                "Value out of range. Value:\"" + s + "\" Radix:" + radix);
        return (byte)i;
    }
	
    public static byte parseByte(String s) throws NumberFormatException {
        return parseByte(s, 10);
    }
	
    public static Byte valueOf(String s, int radix)
        throws NumberFormatException {
        return valueOf(parseByte(s, radix));
    }	
	
    public static Byte valueOf(String s) throws NumberFormatException {
        return valueOf(s, 10);
    }

    public static Byte decode(String nm) throws NumberFormatException {
        int i = Integer.decode(nm);
        if (i < MIN_VALUE || i > MAX_VALUE)
            throw new NumberFormatException(
                    "Value " + i + " out of range from input " + nm);
        return valueOf((byte)i);
    }

    private final byte value;

    public Byte(byte value) {
        this.value = value;
    }

    public Byte(String s) throws NumberFormatException {
        this.value = parseByte(s, 10);
    }
	
    public byte byteValue() {
        return value;
    }

    public short shortValue() {
        return (short)value;
    }	
	
    public int intValue() {
        return (int)value;
    }
	
    public long longValue() {
        return (long)value;
    }	
	
    public float floatValue() {
        return (float)value;
    }

    public double doubleValue() {
        return (double)value;
    }
	
    public String toString() {
        return Integer.toString((int)value);
    }
	
    @Override
    public int hashCode() {
        return Byte.hashCode(value);
    }

    public static int hashCode(byte value) {
        return (int)value;
    }

    public boolean equals(Object obj) {
        if (obj instanceof Byte) {
            return value == ((Byte)obj).byteValue();
        }
        return false;
    }

    public int compareTo(Byte anotherByte) {
        return compare(this.value, anotherByte.value);
    }	
	
    public static int compare(byte x, byte y) {
        return x - y;
    }
	
    public static int toUnsignedInt(byte x) {
        return ((int) x) & 0xff;
    }

    public static long toUnsignedLong(byte x) {
        return ((long) x) & 0xffL;
    }

    public static final int SIZE = 8;
	
    public static final int BYTES = SIZE / Byte.SIZE;
	
    private static final long serialVersionUID = -7183698231559129828L;
}

抛出以表示应用程序已尝试将字符串转换为其中一个数字类型,但该字符串不具有相应的格式。

package java.lang;


public
class NumberFormatException extends IllegalArgumentException {
    static final long serialVersionUID = -2848938806368998894L;

    public NumberFormatException () {
        super();
    }

    public NumberFormatException (String s) {
        super (s);
    }

    static NumberFormatException forInputString(String s) {
        return new NumberFormatException("For input string: \"" + s + "\"");
    }
}

抛出表示一种方法已经通过了非法或不正确的参数。

package java.lang;

public
class IllegalArgumentException extends RuntimeException {

    public IllegalArgumentException() {
        super();
    }

    public IllegalArgumentException(String s) {
        super(s);
    }

    public IllegalArgumentException(String message, Throwable cause) {
        super(message, cause);
    }

    public IllegalArgumentException(Throwable cause) {
        super(cause);
    }

    private static final long serialVersionUID = -5365630128856068164L;
}

方法中抛出了NumberFormatException异常,但是在上面的代码中我们没有找到try...catch来处理

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String str="123";
        int temp=Integer.parseInt(str);
        System.out.println(temp*temp);
    }

  public static int parseInt(String s) throws NumberFormatException {
    return parseInt(s,10);
    }

按照我们异常处理的知识,如果一个方法通过throws抛出了异常,那么可以在抛出异常的方法中不适用try...catch,但是在调用这个方法的地方必须有try...catch来处理。

RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。可能在执行方法期间抛出但未被捕获的RuntimeException 的任何子类都无需在 throws 子句中进行声明。

NumberFormatException是RuntimeException的子类,那么这就需要我们清楚Exception和RuntimeException的概念:

  1. CheckedException:在程序中必须使用try...catch进行处理。
  2. RuntimeException:可以不使用try...catch进行处理,但是如果有异常产生,则异常将由JVM进行处理。

Exception 属于应用程序级别的异常,这类异常必须捕捉,Exception体系包括RuntimeException体系和其他非RuntimeException的体系

RuntimeException 表示系统异常,比较严重,如果出现RuntimeException,那么一定是程序员的错误

对于RuntimeException的子类最好也使用异常处理机制。虽然RuntimeException的异常可以不使用try...catch进行处理,但是如果一旦发生异常,则肯定会导致程序中断执行,所以,为了保证程序再出错后依然可以执行,在开发代码时最好使用try...catch的异常处理机制进行处理。

package java.lang;


public class RuntimeException extends Exception {
    static final long serialVersionUID = -7034897190745766939L;

    public RuntimeException() {
        super();
    }

    public RuntimeException(String message) {
        super(message);
    }

    public RuntimeException(String message, Throwable cause) {
        super(message, cause);
    }

    public RuntimeException(Throwable cause) {
        super(cause);
    }

    protected RuntimeException(String message, Throwable cause,
                               boolean enableSuppression,
                               boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

Exception类,分为checked和unchecked。

Exception是程序正常运行中可以预料的意外情况,可能并且应该被捕获,进行相应处理。

所谓“检查型异常”是指在源代码例必须显式地进行捕获处理,这是编译期检查的一部分。也就是说,当你看到某个方法声明中可能抛出某个检查型异常,那么作为调用方必须考虑如何处理这个异常,否则编译器就是给出错误提示。

写代码的时候,IDE(比如Eclipse)会要求你写try catch的那种Exception,比如IOException。这种Exception是Java的设计者要求你的程序去处理的。这种异常一般不会影响程序的主体,容易手动诊断修复,所以Java要求你在catch下面写出处理的代码,以保证程序遇到此类exception之后还可以正常运行。

public
class IOException extends Exception {

}

“非检查型异常”,通常是可以通过编码加以避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。例如NullPointerException、ArrayIndexOutOfBoundsException等。也就是说,程序员应该通过合理编码来努力避免程序出现这类异常,或者说程序出现这类异常就是程序员的责任。

这一类就是你在代码处理了checked exception之后,你在运行时候依然会遇到的exception,所以又叫做RunTimeException,比如NullPointerException, IndexOutOfBoundsException。此类exception相较于前面那种更容易影响程序运行,从设计者角度不提倡从程序中catch出来并处理,当然你也可以这么做。

package java.lang;

public class Exception extends Throwable {
    static final long serialVersionUID = -3387516993124229948L;

    public Exception() {
        super();
    }

    public Exception(String message) {
        super(message);
    }

    public Exception(String message, Throwable cause) {
        super(message, cause);
    }

    public Exception(Throwable cause) {
        super(cause);
    }

    protected Exception(String message, Throwable cause,
                        boolean enableSuppression,
                        boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

Throwable类是整个异常体系类的父级类,当然最终追根溯源到底的父类当然要归于Object类。Throwable类实现了Serializable接口,表示Throwable可以进行序列化,继承自Object类,他的子类主要是Error和Exception类还有一个StackRecorder类(不是很常见)。
在Throwable类中使用输出流来进行输出,并把其对象作为输出流对象,这就需要必须实现序列化接口,使得其可以进行序列化,才能作为输出流中的对象进行输出。

继承Object类
1. 在编译时,如果类没有继承的父类的话,会自动为其加入继承父类Object的相关的类的编译信息,这样在后面虚拟器进行解释执行的时候,按照存在父类进行处理就可以了。

2. 在虚拟机进行执行的时候,如果仍然存在没有父类的类,仍然会默认其父类为Object。

第一种情况属于再编译器进行处理,第二种情况属于在虚拟机上面做适当的处理。

默认是空的StackTrace的节点数组初始化为空的stack,getOurStackTrace()方法实现的主要是获取当前节点异常的信息,获取栈上面的异常信息,遍历每一个异常信息,赋值给stackTrace进行保存。

获取到栈异常信息以后,输出异常信息,对该数组进行遍历,输出异常的位置。

getSuppressed方法如下:

getCause()方法如下:

其中,getSuppressed方法返回了被抑制(可能是try住的)的所有的异常信息,然后getCause()方法返回的是异常的原因,其中cause是一个Throwable属性,初始化为其本身this, 如果这个throwable中cause要么是抛出异常的类,要么是null,如果是Throwable类本身的话,那么只能说明Throwable类没有初始化完毕。
这个cause属性使得java可以通过链式的结构来组织异常信息,通过cause指向其下一个异常的抛出类。依次构成链状的结构。

下面这段代码中最后几行中,就展示了这种链式的结构通过递归的形式遍历并输出的过程。

package java.lang;
import  java.io.*;
import  java.util.*;

public class Throwable implements Serializable {
    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -3042686055658047285L;

    private transient Object backtrace;

    private String detailMessage;

    private static class SentinelHolder {

        public static final StackTraceElement STACK_TRACE_ELEMENT_SENTINEL =
            new StackTraceElement("", "", null, Integer.MIN_VALUE);

        public static final StackTraceElement[] STACK_TRACE_SENTINEL =
            new StackTraceElement[] {STACK_TRACE_ELEMENT_SENTINEL};
    }

    private static final StackTraceElement[] UNASSIGNED_STACK = new StackTraceElement[0];

    private Throwable cause = this;

    private StackTraceElement[] stackTrace = UNASSIGNED_STACK;

    // Setting this static field introduces an acceptable
    // initialization dependency on a few java.util classes.
    private static final List<Throwable> SUPPRESSED_SENTINEL =
        Collections.unmodifiableList(new ArrayList<Throwable>(0));

    private List<Throwable> suppressedExceptions = SUPPRESSED_SENTINEL;

    /** Message for trying to suppress a null exception. */
    private static final String NULL_CAUSE_MESSAGE = "Cannot suppress a null exception.";

    /** Message for trying to suppress oneself. */
    private static final String SELF_SUPPRESSION_MESSAGE = "Self-suppression not permitted";

    /** Caption  for labeling causative exception stack traces */
    private static final String CAUSE_CAPTION = "Caused by: ";

    /** Caption for labeling suppressed exception stack traces */
    private static final String SUPPRESSED_CAPTION = "Suppressed: ";

    public Throwable() {
        fillInStackTrace();
    }

    public Throwable(String message) {
        fillInStackTrace();
        detailMessage = message;
    }

    public Throwable(String message, Throwable cause) {
        fillInStackTrace();
        detailMessage = message;
        this.cause = cause;
    }

    public Throwable(Throwable cause) {
        fillInStackTrace();
        detailMessage = (cause==null ? null : cause.toString());
        this.cause = cause;
    }

    protected Throwable(String message, Throwable cause,
                        boolean enableSuppression,
                        boolean writableStackTrace) {
        if (writableStackTrace) {
            fillInStackTrace();
        } else {
            stackTrace = null;
        }
        detailMessage = message;
        this.cause = cause;
        if (!enableSuppression)
            suppressedExceptions = null;
    }

    public String getMessage() {
        return detailMessage;
    }

    public String getLocalizedMessage() {
        return getMessage();
    }

    public synchronized Throwable getCause() {
        return (cause==this ? null : cause);
    }

    public synchronized Throwable initCause(Throwable cause) {
        if (this.cause != this)
            throw new IllegalStateException("Can't overwrite cause with " +
                                            Objects.toString(cause, "a null"), this);
        if (cause == this)
            throw new IllegalArgumentException("Self-causation not permitted", this);
        this.cause = cause;
        return this;
    }

    public String toString() {
        String s = getClass().getName();
        String message = getLocalizedMessage();
        return (message != null) ? (s + ": " + message) : s;
    }

    public void printStackTrace() {
        printStackTrace(System.err);

    public void printStackTrace(PrintStream s) {
        printStackTrace(new WrappedPrintStream(s));
    }

    private void printStackTrace(PrintStreamOrWriter s) {
        // Guard against malicious overrides of Throwable.equals by
        // using a Set with identity equality semantics.
        Set<Throwable> dejaVu =
            Collections.newSetFromMap(new IdentityHashMap<Throwable, Boolean>());
        dejaVu.add(this);

        synchronized (s.lock()) {
            // Print our stack trace
            s.println(this);
            StackTraceElement[] trace = getOurStackTrace();
            for (StackTraceElement traceElement : trace)
                s.println("\tat " + traceElement);

            // Print suppressed exceptions, if any
            for (Throwable se : getSuppressed())
                se.printEnclosedStackTrace(s, trace, SUPPRESSED_CAPTION, "\t", dejaVu);

            // Print cause, if any
            Throwable ourCause = getCause();
            if (ourCause != null)
                ourCause.printEnclosedStackTrace(s, trace, CAUSE_CAPTION, "", dejaVu);
        }
    }

    private void printEnclosedStackTrace(PrintStreamOrWriter s,
                                         StackTraceElement[] enclosingTrace,
                                         String caption,
                                         String prefix,
                                         Set<Throwable> dejaVu) {
        assert Thread.holdsLock(s.lock());
        if (dejaVu.contains(this)) {
            s.println("\t[CIRCULAR REFERENCE:" + this + "]");
        } else {
            dejaVu.add(this);
            // Compute number of frames in common between this and enclosing trace
            StackTraceElement[] trace = getOurStackTrace();
            int m = trace.length - 1;
            int n = enclosingTrace.length - 1;
            while (m >= 0 && n >=0 && trace[m].equals(enclosingTrace[n])) {
                m--; n--;
            }
            int framesInCommon = trace.length - 1 - m;

            // Print our stack trace
            s.println(prefix + caption + this);
            for (int i = 0; i <= m; i++)
                s.println(prefix + "\tat " + trace[i]);
            if (framesInCommon != 0)
                s.println(prefix + "\t... " + framesInCommon + " more");

            // Print suppressed exceptions, if any
            for (Throwable se : getSuppressed())
                se.printEnclosedStackTrace(s, trace, SUPPRESSED_CAPTION,
                                           prefix +"\t", dejaVu);

            // Print cause, if any
            Throwable ourCause = getCause();
            if (ourCause != null)
                ourCause.printEnclosedStackTrace(s, trace, CAUSE_CAPTION, prefix, dejaVu);
        }
    }

    public void printStackTrace(PrintWriter s) {
        printStackTrace(new WrappedPrintWriter(s));
    }

    private abstract static class PrintStreamOrWriter {
        /** Returns the object to be locked when using this StreamOrWriter */
        abstract Object lock();

        /** Prints the specified string as a line on this StreamOrWriter */
        abstract void println(Object o);
    }

    private static class WrappedPrintStream extends PrintStreamOrWriter {
        private final PrintStream printStream;

        WrappedPrintStream(PrintStream printStream) {
            this.printStream = printStream;
        }

        Object lock() {
            return printStream;
        }

        void println(Object o) {
            printStream.println(o);
        }
    }

    private static class WrappedPrintWriter extends PrintStreamOrWriter {
        private final PrintWriter printWriter;

        WrappedPrintWriter(PrintWriter printWriter) {
            this.printWriter = printWriter;
        }

        Object lock() {
            return printWriter;
        }

        void println(Object o) {
            printWriter.println(o);
        }
    }

    public synchronized Throwable fillInStackTrace() {
        if (stackTrace != null ||
            backtrace != null /* Out of protocol state */ ) {
            fillInStackTrace(0);
            stackTrace = UNASSIGNED_STACK;
        }
        return this;
    }

    private native Throwable fillInStackTrace(int dummy);

    public StackTraceElement[] getStackTrace() {
        return getOurStackTrace().clone();
    }

    private synchronized StackTraceElement[] getOurStackTrace() {
        // Initialize stack trace field with information from
        // backtrace if this is the first call to this method
        if (stackTrace == UNASSIGNED_STACK ||
            (stackTrace == null && backtrace != null) /* Out of protocol state */) {
            int depth = getStackTraceDepth();
            stackTrace = new StackTraceElement[depth];
            for (int i=0; i < depth; i++)
                stackTrace[i] = getStackTraceElement(i);
        } else if (stackTrace == null) {
            return UNASSIGNED_STACK;
        }
        return stackTrace;
    }

    public void setStackTrace(StackTraceElement[] stackTrace) {
        // Validate argument
        StackTraceElement[] defensiveCopy = stackTrace.clone();
        for (int i = 0; i < defensiveCopy.length; i++) {
            if (defensiveCopy[i] == null)
                throw new NullPointerException("stackTrace[" + i + "]");
        }

        synchronized (this) {
            if (this.stackTrace == null && // Immutable stack
                backtrace == null) // Test for out of protocol state
                return;
            this.stackTrace = defensiveCopy;
        }
    }

    native int getStackTraceDepth();

    native StackTraceElement getStackTraceElement(int index);

    private void readObject(ObjectInputStream s)
        throws IOException, ClassNotFoundException {
        s.defaultReadObject();     // read in all fields
        if (suppressedExceptions != null) {
            List<Throwable> suppressed = null;
            if (suppressedExceptions.isEmpty()) {
                // Use the sentinel for a zero-length list
                suppressed = SUPPRESSED_SENTINEL;
            } else { // Copy Throwables to new list
                suppressed = new ArrayList<>(1);
                for (Throwable t : suppressedExceptions) {
                    // Enforce constraints on suppressed exceptions in
                    // case of corrupt or malicious stream.
                    if (t == null)
                        throw new NullPointerException(NULL_CAUSE_MESSAGE);
                    if (t == this)
                        throw new IllegalArgumentException(SELF_SUPPRESSION_MESSAGE);
                    suppressed.add(t);
                }
            }
            suppressedExceptions = suppressed;
        } // else a null suppressedExceptions field remains null

        if (stackTrace != null) {
            if (stackTrace.length == 0) {
                stackTrace = UNASSIGNED_STACK.clone();
            }  else if (stackTrace.length == 1 &&
                        // Check for the marker of an immutable stack trace
                        SentinelHolder.STACK_TRACE_ELEMENT_SENTINEL.equals(stackTrace[0])) {
                stackTrace = null;
            } else { // Verify stack trace elements are non-null.
                for(StackTraceElement ste : stackTrace) {
                    if (ste == null)
                        throw new NullPointerException("null StackTraceElement in serial stream. ");
                }
            }
        } else {
            // A null stackTrace field in the serial form can result
            // from an exception serialized without that field in
            // older JDK releases; treat such exceptions as having
            // empty stack traces.
            stackTrace = UNASSIGNED_STACK.clone();
        }
    }

    private synchronized void writeObject(ObjectOutputStream s)
        throws IOException {
        // Ensure that the stackTrace field is initialized to a
        // non-null value, if appropriate.  As of JDK 7, a null stack
        // trace field is a valid value indicating the stack trace
        // should not be set.
        getOurStackTrace();

        StackTraceElement[] oldStackTrace = stackTrace;
        try {
            if (stackTrace == null)
                stackTrace = SentinelHolder.STACK_TRACE_SENTINEL;
            s.defaultWriteObject();
        } finally {
            stackTrace = oldStackTrace;
        }
    }

    public final synchronized void addSuppressed(Throwable exception) {
        if (exception == this)
            throw new IllegalArgumentException(SELF_SUPPRESSION_MESSAGE, exception);

        if (exception == null)
            throw new NullPointerException(NULL_CAUSE_MESSAGE);

        if (suppressedExceptions == null) // Suppressed exceptions not recorded
            return;

        if (suppressedExceptions == SUPPRESSED_SENTINEL)
            suppressedExceptions = new ArrayList<>(1);

        suppressedExceptions.add(exception);
    }

    private static final Throwable[] EMPTY_THROWABLE_ARRAY = new Throwable[0];

    public final synchronized Throwable[] getSuppressed() {
        if (suppressedExceptions == SUPPRESSED_SENTINEL ||
            suppressedExceptions == null)
            return EMPTY_THROWABLE_ARRAY;
        else
            return suppressedExceptions.toArray(EMPTY_THROWABLE_ARRAY);
    }
}

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入学习java源码之Byte.decode()与Byte.toUnsignedInt() 的相关文章

  • 深入学习java源码之Integer.parseInt()与Integer.valueOf()

    深入学习java源码之Integer parseInt 与Integer valueOf 一般我们创建一个类的时候是通过new关键字 比如 Object obj new Object 但是对于 Integer 类 我们却可以这样 Integ
  • 深入学习java源码之Math.scalb()与 Math.powerOfTwoF()

    深入学习java源码之Math scalb 与 Math powerOfTwoF final关键字 final在Java中是一个保留的关键字 可以声明成员变量 方法 类以及本地变量 一旦你将引用声明作final 你将不能改变这个引用了 编译
  • java泛型代码编写

    java泛型代码编写 泛型的由来 我们先看下面这段代码 List list new ArrayList list add 24 向集合中添加一个 Integer 类型的数据 list add Tom 向集合中添加一个 String 类型的数
  • Unsafe初探

    Unsafe Unsafe 是sun misc Unsafe下的一个包 通过这个类可以直接使用底层native方法来获取和操作底层的数据 例如获取一个字段在内存中的偏移量 利用偏移量直接获取或修改一个字段的数据等等 当然这个类正如他的名字一
  • 深入学习java源码之ArrayList.addAll()与ArrayList.retainAll()

    深入学习java源码之ArrayList addAll 与ArrayList retainAll 引入多态 List是接口 所以实现类要把接口中的抽象方法全部重写 在重写的时候父类中的方法的时候 操作的数据类型也是要与父类保持一致的 所以父
  • Spring Bean生命周期doCreateBean源码阅读

    bean的生命周期的几个后置接口都是在这个方法里面调用 所以单独开一篇该方法的源码阅读 下面从两个点来阅读 1 何时调用 只看容器启动 2 梳理这个方法的流程 跟上一节对应上 先贴上源码 protected Object doCreateB
  • 深入学习java源码之ArrayList.iterator()与ArrayList.listIterator()

    深入学习java源码之ArrayList iterator 与ArrayList listIterator 内部类的使用典型的情况是 内部类继承自某个类或实现某个接口 内部类的代码操作创建其的外层类的对象 所以你可以认为内部类提供了某种进入
  • 深入学习java源码之Byte.decode()与Byte.toUnsignedInt()

    深入学习java源码之Byte decode 与Byte toUnsignedInt 异常 异常就是有异于常态 和正常情况不一样 有错误出错 在java中 阻止当前方法或作用域的情况 称之为异常 其中Error类中包括虚拟机错误和线程死锁
  • Java多线程代码编写

    Java多线程代码编写 什么是多线程 并发和并行 并行 指两个或多个时间在同一时刻发生 同时发生 并发 指两个或多个事件在一个时间段内发生 在操作系统中 安装了多个程序 并发指的是在一段时间内宏观上有多个程序同时运行 这在单 CPU 系统中
  • Java动态代理代码编写

    Java动态代理代码编写 代理的概念 动态代理技术是整个java技术中最重要的一个技术 它是学习java框架的基础 不会动态代理技术 那么在学习Spring这些框架时是学不明白的 动态代理技术就是用来产生一个对象的代理对象的 在开发中为什么
  • 堵塞队列之ArrayBlockingQueue和LinkedBlockingQueue解析

    在线程池创建的时候 需要传一个堵塞队列来维护需要执行的线程任务 其中最常用的是ArrayBlockingQueue和LinkedBlockingQueue 他们都继承了BlockingQueue接口 ArrayBlockingQueue 一
  • 使用java关键字编写代码

    使用java关键字编写代码 java的关键字 java的基本数据类型 Java是一种强类型语言 必须为每一个变量声明一种类型 Java共包含8中基本类型 其中4种整型 2种浮点型 1种用于表示Unicode编码的字符单元的字符类型char和
  • 线程池面试题

    线程池面试题 1 Executor 框架三大组成部分 2 ThreadPoolExecutor 类 线程池执行器 核心 2 1 ThreadPoolExecutor 3 个最重要的参数 2 2 ThreadPoolExecutor 饱和策略
  • 基于springboot+微信小程序实现校园互助平台项目演示【附项目源码+论文说明】

    基于springboot 微信小程序实现校园互助平台项目演示 摘要 随着我国经济迅速发展 人们对手机的需求越来越大 各种手机软件也都在被广泛应用 但是对于手机进行数据信息管理 对于手机的各种软件也是备受用户的喜爱 校园互助平台被用户普遍使用
  • 基于java中SSM框架+小程序实现乐器商城程序设计演示【附项目源码】

    基于java中SSM框架 小程序实现乐器商城程序设计演示 JAVA简介 JAVA语言是目前软件市场上应用最广泛的语言开发程序 可以在多种平台上运用的 兼容性比较强 适应市面上大多数操作系统 不会出现乱码的现像 其扩展性和维护性都更好 具有分
  • 基于springboot+vue实现汽车改装方案网站演示【附项目源码+论文说明】

    基于springboot vue实现汽车改装方案网站演示 摘要 本文主要讲述了基于SpringBoot MySql开发技术开发的汽车改装方案网站的设计与实现 这里的汽车改装方案网站是通过一个平台使所有的汽车爱好者们可以不用出门就可以体验到专
  • 基于springboot+vue实现实企业任务管理追踪系统【附项目源码+论文说明】

    基于springboot vue实现实企业任务管理追踪系统 摘要 随着时代的进步 人们现在通过计算机线上化的办公方式成功的提升了日常办公的效率 通过线上办公能够有效地提升信息传递的效率 可以快速的完成任务的流程处理 邮件的发送等等功能 并且
  • 基于springboot+vue实现流浪动物救助平台演示【附项目源码+论文说明】

    基于springboot vue实现流浪动物救助平台演示 摘要 随着人们对于动物及环境保护的意识越来越强 流浪动物的救助与保护涉及到了健康卫生以及城市容貌等多个方面 流浪动物保护是一个全球性的问题 不同的国家和地区都出台了形式多样的保护办法
  • 基于springboot+vue实现食品安全管理系统演示【附项目源码+论文说明】

    基于springboot vue实现食品安全管理系统演示 摘要 食品行业同其他行业有很多的差别 食品行业不仅要管食品的生产和销售 还要管食品的库存和保质期 那么对于食品管理者来说 就存在着一定的难度 况且食品的种类复杂 存储条件各不相同 存
  • 基springboot+vue实现开放实验室管理系统子系统【附项目源码+论文说明】

    基springboot vue实现开放实验室管理系统子系统 摘要 信息技术永远是改变生活的第一种创新方式 各种行业的发展更是脱离不了科技化的支持 原本传统的行业正在被科技行业的切入悄悄的发生变化 就拿我们生活当中常见的事情举例而言 在外卖行

随机推荐

  • Hexo 博客利用 Nginx 实现中英文切换

    本文记录了对 Hexo 博客进行中英文切换的配置过程 实现同一应用共用模版 任何页面可以切换到另一语言的对应页面 并对未明确语言的访问地址 根据浏览器语言进行自动跳转 实现细则 中英文地址区分 博客中文首页 https chanvinxia
  • Filter内存马浅析

    1 何谓内存马 以Tomcat为例 内存马主要利用了Tomcat的部分组件会在内存中长期驻留的特性 只要将我们的恶意组件注入其中 就可以一直生效 直到容器重启 Java内存shell有很多种 大致分为 1 动态注册filter 2 动态注册
  • 为何pytorch nn.KLDivLoss()损失计算为负数?

    参考文献 https www zhihu com question 384982085 先来看一下KL散度的定义 这里是要用分布Q为标签 原始分布 分布P作为预测值 预测分布 在pytorch中 nn KLDivLoss 的计算公式如下 上
  • 《基于RCF边缘检测和双目视觉的箱体体积测量算法》论文阅读笔记

    原论文查看地址 https csnjiokh71 feishu cn file boxcnyF7HGMFDiWayf0vSTcYTec 1 双目畸变的原理分析 实际情况下 相机的主点 c x c y 并不位于图像中心 两者存在一定的偏差 而
  • 鹅厂内部干货

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 作者介绍 陈阳 Younger 2011年加入腾讯 现就职于腾讯游戏增值服务部 负责AMS游戏营销平台 致力于研究和推动Web及大前端相关技术的发展 一 微信小游戏 H5小游戏及微信
  • “1448万,一条命”:在生命面前,金钱显得太刺眼

    1 前段时间 美国上市了一种治疗小儿脊髓性肌肉萎缩的药 引起了非常激烈的讨论 为什么会有这么大的争议呢 因为这种药特别贵 标价210万美元 人民币约1448万元 仅仅一支药 就相当于北京三环一套房 小儿脊髓性肌肉萎缩这个病到底有多恐怖呢 得
  • 利用bat,vb实现根据日期自动备份文件

    假如D backup a为备份源文件夹 备份路径为D backup 文件夹名为当天的日期 如D backup 2006 04 17 a 每周5备份一次 3周一个循环 即备份第4周时 第1周的备份删除 以减少空间 同时在D backup lo
  • 基于单片机的电子万年历设计与制作系统(设计报告+开题中期报告+仿真文件+程序)

    摘要 本文设计实现了一种基于单片机的电子万年历设计与制作系统 该系统通过单片机的控制 实现了日期 时间和节假日等信息的显示 同时提供了闹钟 定时器和温度显示等功能 实验结果表明 该系统具有较好的稳定性和实用性 能够满足人们对万年历功能的需求
  • kotlin语法总结(一)

    下一章地址 kotlin语法总结 二 文章目录 前言 前言 接下来几章将总结一下kotlin的语法 总结kotlin和java不一样的地方 1 var可修改 val只读 类型推断 const val a 1 编译时常量 2 kotlin只提
  • 假设检验之参数

    假设检验 p值的判断使用 很强很有用
  • Pytorch调用GPU的方法

    Pytorch调用GPU有两种方法 一种是torch cuda 一种是torch to torch cuda 通常会在配置文件中写入调用的GPU 默认不填参数为0 gpu 0 1 2 默认调用调用0号GPU network network
  • UVM 寄存器内建测试序列(built-in sequences)

    原文链接 https blog csdn net qq 42419590 article details 121487295 UVM 寄存器内建测试序列 built in sequences 不少有经验的UVM用户可能会忽略UVM针对寄存器
  • 电子设计大赛作品_竞赛来袭

    2020电子设计大赛 一年一度的电子设计大赛要来啦 想不想与同学好友一起打电赛 结识众多大佬 掌握各种专业知识 做出属于自己的作品 手捧奖状 让自己的大学简历更有含金量呢 那就和小电一起来看看吧 一 竞赛简介 全国大学生电子设计竞赛 以下简
  • HTMLTestRunner 加强版 HwTestReport 加入样式美化、中英文版本、Selenium和Appium截图、饼图等内容

    本项目源码已经进入Github的北极代码仓库 Arctic Code Vault 据说这些Bug Code 要冰封1000年 作为 HwTTK Test Tool Kit 中的一员 HwTestReport具有以下特性 支持Python2和
  • pycharm+python3.8安装opencv+contrib

    A opencv python与opencv contrib python的区别 1 opencv python包含opencv的主模块 下载地址 https pypi org project opencv python files 2 o
  • 评测指标(metrics)

    评测指标 metrics metric主要用来评测机器学习模型的好坏程度 不同的任务应该选择不同的评价指标 分类 回归和排序问题应该选择不同的评价函数 不同的问题应该不同对待 即使都是 分类问题也不应该唯评价函数论 不同问题不同分析 回归
  • Gin中的Cookie和Session的用法

    Gin中的Cookie和Session的用法 文章目录 Gin中的Cookie和Session的用法 介绍 Cookie 代码演示 Session 代码展示 介绍 cookie 和 session 是 Web 开发中常用的两种技术 主要用于
  • 【Logback】<appender>标签详解

    文章目录 一 Appender是什么 1 1 Appender定义 1 2 Appender类图说明 二 Appender概述 三 ConsoleAppender使用 四 FileAppender使用 4 1 FileAppender使用
  • 2024年王道数据结构【考研全套笔记】

    22年 23年数据结构大纲一致 24年大纲 gt 目前和23年大纲保持一致 该博客怎么食用 大部分考408的友友 只是买了书 书上配置的免费视频是滞后2年的 非常不友好 建议在某鱼上or大学慕课正规购买 还是最新的视频香 看完视频必须做笔记
  • 深入学习java源码之Byte.decode()与Byte.toUnsignedInt()

    深入学习java源码之Byte decode 与Byte toUnsignedInt 异常 异常就是有异于常态 和正常情况不一样 有错误出错 在java中 阻止当前方法或作用域的情况 称之为异常 其中Error类中包括虚拟机错误和线程死锁