java.lang.IllegalArgumentException: Invalid path解决方案

当在读取外置存储信息时遇到java.lang.IllegalArgumentException: Invalid path问题,此异常通常在TF卡反复插拔后出现。通过查看Logcat、分析源码、理解错误原因及查阅官方文档,可以发现从API 19开始此权限被严格控制。解决方案包括检查READ_EXTERNAL_STORAGE权限设置,理解在特定API级别下应用是否需要此权限,并确保在适当情况下使用应用特定的文件目录。

功能:读取外置存储的信息。

现象:在反弹插拔TF卡之后,会弹出强制关闭

概率:反复插拔TF卡会出现,在一定时间内多次插拔,可以达到必现

Logcat:

E/AndroidRuntime( 2920): FATAL EXCEPTION: main
E/AndroidRuntime( 2920): Process: com.borqs.factorytest, PID: 2920
E/AndroidRuntime( 2920): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.MEDIA_MOUNTED dat=file:///mnt/external_sd flg=0x4000010 (has extras) } in com.borqs.factorytest.activity.ComprehensiveTest$7@1de3ce77
E/AndroidRuntime( 2920): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:876)
E/AndroidRuntime( 2920): at android.os.Handler.handleCallback(Handler.java:739)
E/AndroidRuntime( 2920): at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime( 2920): at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime( 2920): at android.app.ActivityThread.main(ActivityThread.java:5280)
E/AndroidRuntime( 2920): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 2920): at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime( 2920): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:963)
E/AndroidRuntime( 2920): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:758)
E/AndroidRuntime( 2920): Caused by: java.lang.IllegalArgumentException: Invalid path: /mnt/external_sd
E/AndroidRuntime( 2920): at android.os.StatFs.doStat(StatFs.java:46)
E/AndroidRuntime( 2920): at android.os.StatFs.<init>(StatFs.java:39)
E/AndroidRuntime( 2920): at com.borqs.factorytest.activity.Compr
`java.lang.IllegalArgumentException: Invalid base file path:O:\webWork\logs` 错误表示提供的文件路径不合法,以下是可能的解决方法: #### 检查路径格式 在Windows系统中,反斜杠 `\` 是路径分隔符,但在Java字符串中,反斜杠是转义字符。因此,需要使用双反斜杠 `\\` 或者原始字符串(Java 13及以上支持)来表示路径。 **错误示例**: ```java String path = "O:\webWork\logs"; // 会导致错误,因为 \w 和 \l 会被当作转义序列 ``` **正确示例**: ```java String path = "O:\\webWork\\logs"; // 使用双反斜杠 ``` 或者使用原始字符串(Java 13及以上): ```java String path = r"O:\webWork\logs"; // 使用原始字符串 ``` #### 检查路径是否存在 确保指定的路径在文件系统中确实存在。可以使用 `java.io.File` 类来检查路径是否存在,如果不存在,可以选择创建目录。 ```java import java.io.File; public class CheckFilePath { public static void main(String[] args) { String path = "O:\\webWork\\logs"; File file = new File(path); if (!file.exists()) { boolean created = file.mkdirs(); if (created) { System.out.println("目录已创建"); } else { System.out.println("无法创建目录"); } } } } ``` #### 检查权限 确保Java程序有足够的权限访问指定的路径。如果没有权限,可能会导致路径无效的错误。可以检查文件系统的权限设置,确保程序运行的用户账户有访问该路径的权限。 #### 检查特殊字符 确保路径中不包含特殊字符或非法字符。某些字符在文件系统中是不允许作为文件名或路径名的一部分的,例如 `/`、`\`、`:`、`*`、`?`、`"`、`<`、`>`、`|` 等。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值