MST

星途 面试题库

面试题:Java基本数据类型转换规则下的强制类型转换风险

请编写一段Java代码,演示在将一个较大范围的基本数据类型(如int)强制转换为较小范围的基本数据类型(如byte)时,可能会出现的数据丢失情况,并解释为什么会出现这种情况以及如何避免。
16.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
public class DataTypeConversion {
    public static void main(String[] args) {
        int largeNumber = 200;
        byte smallNumber;
        smallNumber = (byte) largeNumber;
        System.out.println("转换前的 int 类型值: " + largeNumber);
        System.out.println("转换后的 byte 类型值: " + smallNumber);
    }
}

数据丢失原因

  1. 数据范围差异int类型占据4个字节(32位),可以表示的范围是 -2147483648 到 2147483647 ,而byte类型只占据1个字节(8位),能表示的范围是 -128 到 127 。
  2. 截断操作:当把int类型强制转换为byte类型时,Java会直接截断int类型数据的高位字节,只保留低8位。例如上述代码中,int类型值200的二进制表示为00000000 00000000 00000000 11001000,转换为byte时,只保留低8位11001000,这在有符号数中表示为 -56 ,导致数据丢失。

避免方法

  1. 范围检查:在进行强制类型转换之前,先检查int值是否在byte类型的范围内。如果在范围内再进行转换,就可以避免数据丢失。
public class DataTypeConversion {
    public static void main(String[] args) {
        int largeNumber = 200;
        if (largeNumber >= Byte.MIN_VALUE && largeNumber <= Byte.MAX_VALUE) {
            byte smallNumber = (byte) largeNumber;
            System.out.println("转换后的 byte 类型值: " + smallNumber);
        } else {
            System.out.println("数值超出 byte 类型范围,无法安全转换");
        }
    }
}
  1. 使用包装类:使用Byte包装类的valueOf(int)方法,该方法会自动进行范围检查,如果超出范围会抛出NumberFormatException异常,这样可以通过捕获异常来处理转换失败的情况。
public class DataTypeConversion {
    public static void main(String[] args) {
        int largeNumber = 200;
        try {
            Byte smallNumber = Byte.valueOf((byte) largeNumber);
            System.out.println("转换后的 byte 类型值: " + smallNumber);
        } catch (NumberFormatException e) {
            System.out.println("数值超出 byte 类型范围,无法安全转换");
        }
    }
}