ZetCode

Java CharConversionException 类

最后修改时间:2025 年 4 月 16 日

java.io.CharConversionException 是在发生字符转换错误时抛出的异常。它表示字符编码或解码操作期间出现问题。这是一个已检查异常,它扩展了 IOException。

CharConversionException 通常在读取或写入具有不兼容字符编码的文本数据时发生。 它指示格式错误的输入数据或不支持的字符映射。 应用程序应优雅地处理此异常。

CharConversionException 类概述

CharConversionException 扩展了 IOException,表示字符转换失败。 它有两个构造函数 - 一个默认构造函数和一个接受错误消息的构造函数。 没有提供其他方法。

public class CharConversionException extends IOException {
    public CharConversionException();
    public CharConversionException(String s);
}

上面的代码显示了 CharConversionException 的简单结构。 第一个构造函数创建一个没有消息的异常。 第二个允许指定自定义错误消息来描述转换失败。

基本 CharConversionException 示例

此示例演示了一个简单的例子,其中可能会抛出 CharConversionException。 我们将尝试读取具有不支持的编码的文件。

Main.java
import java.io.*;

public class Main {
    public static void main(String[] args) {
        try {
            // Attempt to read with unsupported encoding
            InputStreamReader reader = new InputStreamReader(
                new FileInputStream("data.txt"), "UNSUPPORTED_ENCODING");
            
            int data;
            while ((data = reader.read()) != -1) {
                System.out.print((char) data);
            }
            reader.close();
        } catch (CharConversionException e) {
            System.err.println("Character conversion failed: " + e.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此示例尝试使用不支持的字符编码读取文件。 当 InputStreamReader 无法执行请求的字符转换时,它会抛出 CharConversionException。 在使用字符编码时,请始终处理此异常。

处理格式错误的输入

当输入数据包含无效字符序列时,通常会发生 CharConversionException。 此示例演示了在处理文本数据时如何处理此类情况。

Main.java
import java.io.*;

public class Main {
    public static void main(String[] args) {
        // Create a byte array with invalid UTF-8 sequence
        byte[] invalidData = {(byte)0xC0, (byte)0x80}; // Invalid UTF-8
        
        try {
            InputStreamReader reader = new InputStreamReader(
                new ByteArrayInputStream(invalidData), "UTF-8");
            
            int data;
            while ((data = reader.read()) != -1) {
                System.out.print((char) data);
            }
            reader.close();
        } catch (CharConversionException e) {
            System.err.println("Invalid character sequence: " + e.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此示例演示了如何处理无效的 UTF-8 字节序列。 字节数组包含一个无效的 UTF-8 序列,该序列触发了异常。 该程序捕获异常并提供适当的错误消息。

自定义字符转换

在实现自定义字符转换逻辑时,您可能需要抛出 CharConversionException。 此示例演示了如何正确执行此操作。

Main.java
import java.io.*;

public class Main {
    
    static String convertToUpperCase(String input) throws CharConversionException {
        if (input == null) {
            throw new CharConversionException("Input cannot be null");
        }
        
        // Simulate conversion failure for demonstration
        if (input.contains("�")) {
            throw new CharConversionException("Invalid replacement character found");
        }
        
        return input.toUpperCase();
    }

    public static void main(String[] args) {
        try {
            String result = convertToUpperCase("hello world�");
            System.out.println(result);
        } catch (CharConversionException e) {
            System.err.println("Conversion error: " + e.getMessage());
        }
    }
}

此示例显示了一个自定义方法,该方法在遇到无效输入时抛出 CharConversionException。 该方法检查空输入和替换字符。 这演示了在自定义转换逻辑中正确使用异常。

使用不同的编码

此示例显示了当读取具有不匹配编码的文件时,不同的字符编码如何导致 CharConversionException

Main.java
import java.io.*;

public class Main {
    public static void main(String[] args) {
        String filename = "data_utf16.txt";
        
        try {
            // Wrongly assuming UTF-8 for a UTF-16 file
            BufferedReader reader = new BufferedReader(
                new InputStreamReader(
                    new FileInputStream(filename), "UTF-8"));
            
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (CharConversionException e) {
            System.err.println("Encoding mismatch detected: " + e.getMessage());
            System.err.println("Try specifying UTF-16 encoding instead");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此示例尝试使用 UTF-8 编码读取 UTF-16 编码的文件。 不匹配会导致 CharConversionException。 catch 块建议尝试正确的编码。 在处理之前,请务必验证文件编码。

从转换错误中恢复

此示例演示了一种通过在主要编码失败时回退到不同的编码来从字符转换错误中恢复的策略。

Main.java
import java.io.*;

public class Main {
    public static void main(String[] args) {
        String filename = "unknown_encoding.txt";
        String[] encodings = {"UTF-8", "ISO-8859-1", "UTF-16"};
        
        for (String encoding : encodings) {
            try {
                BufferedReader reader = new BufferedReader(
                    new InputStreamReader(
                        new FileInputStream(filename), encoding));
                
                System.out.println("Success with encoding: " + encoding);
                String line;
                while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                }
                reader.close();
                break; // Exit loop if successful
            } catch (CharConversionException e) {
                System.err.println("Failed with " + encoding + 
                    ": " + e.getMessage());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

此示例尝试多种编码,直到找到一个有效的编码。 它从 UTF-8 开始,然后回退到 ISO-8859-1,最后是 UTF-16。 这种方法可以优雅地处理具有未知编码的文件。

防止转换错误

此示例显示了通过验证输入并预先指定正确的编码来防止 CharConversionException 的最佳实践。

Main.java
import java.io.*;
import java.nio.charset.Charset;

public class Main {
    public static void main(String[] args) {
        String filename = "important_data.txt";
        
        try {
            // Check if encoding is supported
            if (!Charset.isSupported("UTF-8")) {
                throw new CharConversionException("UTF-8 not supported");
            }
            
            // Get file encoding from metadata if available
            String detectedEncoding = detectFileEncoding(filename);
            
            BufferedReader reader = new BufferedReader(
                new InputStreamReader(
                    new FileInputStream(filename), detectedEncoding));
            
            // Process file contents
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (CharConversionException e) {
            System.err.println("Encoding problem: " + e.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private static String detectFileEncoding(String filename) {
        // In real implementation, use actual detection logic
        return "UTF-8"; // Default assumption
    }
}

此示例演示了防止转换错误的预防措施。 它在使用前检查编码支持,并尝试检测文件的实际编码。 这些做法降低了 CharConversionException 的可能性。

来源

Java CharConversionException 类文档

在本文中,我们介绍了 Java CharConversionException 类的基本方面。 了解这些概念对于在 Java 应用程序中使用文本数据和字符编码至关重要。

作者

我叫 Jan Bodnar,是一位敬业的程序员,在该领域拥有多年的经验。 我于 2007 年开始撰写编程文章,此后撰写了 1,400 多篇文章和八本电子书。 凭借八年以上的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程