登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> SoftHub关联区 >> 主题: [asd/Android Studio]asd 中修改包名时出现 “Unfortunately,程序名 has stopped” 的解决     [回主站]     [分站链接]
[asd/Android Studio]asd 中修改包名时出现 “Unfortunately,程序名 has stopped” 的解决
clq
浏览(387) - 2020-11-14 19:14:36 发表 编辑

关键字:

[2020-11-14 23:21:02 最后更新]
[asd/Android Studio]asd 中修改包名时出现 “Unfortunately,程序名 has stopped” 的解决

asd 修改包名的方法比较多,正则的应该是文件或者包名用右键 “Refactor” 菜单。默认情况下不够灵活,需要在目录树的右上角齿轮配置图标中点击后取消掉两个选项:
Flaten Packages
Hiden Empty Midlle Packages
然后在弹出的对话框中选择 “Refactor”按钮。
这时还没真正做重构工作,asd 会在 ide 下面显示哪些文件要修改,这时要点击它的 “Do Refactor”按钮才行。
具体可参考 https://jingyan.baidu.com/article/154b46313de80c28ca8f41ab.html
----------------------------------------------------------------
但这样处理的包名只能修改名称,不能去掉某一级父目录。
如果是这种要求可以先建立好新的包名,然后把 java 文件拖放到新目录中,这时候 asd 也会自动做重构。如果这些 java 不涉及界面这样就完完整了。但有界面的还要手工修改 AndroidManifest.xml 中的类名。否则就会出现 “Unfortunately,程序名 has stopped” 的运行异常 -- 虽然编译是没错的。

另外 AndroidManifest.xml 会对错误的包名高亮的,修改很是容易安全。
----------------------------------------------------------------
这里有一个大坑,在 ide 生成的“窗口”中,会引入一个 “R.java”
这实际上是根据那些 “窗口界面 xml ” src\main\res\layout\activity_xxx.xml 等 xml 生成的,理论上应该在 xx.java 源码中引入这个文件,例如
import net.newbt.xmppminiapplication.R;
但,实际上在 asd 中不需要。这在大多数情况下没问题,但我们修改了包后就会在编译环境中生成两个 R.java ! 这在你删除界面的某些控件时会运行时出错,而代码编译没有任何错误!

所以我建立大家还是手工加入这个 xx.R 的 import 。这时候就 "Build" 菜单中的 "Clean project" 先清理一下编译环境的缓存,再运行时就能发现错误了。

所以大家记住了,修改包名或者重构后一定要 build clean 清空掉缓存,以便让潜在的错误显露出来。

另外,还发现一个大问题,通常我们认为 java 在可能异常的地方都会强制要求 try ,这让我们误以为不用 try 的地方就不会异常了。这是一个大错误!至少在界面装载时是可能异常的,所以我强烈建议在“主窗口”的 create 事件中加上异常提示。

例如我们 xmppmini 项目的:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//---------------------------
//要自己加...

try{

//btnLogin = findViewById(R.id.btnLogin);
////btnLogin = findViewById(R.id.btnLogin2); //这是不同的类,会异常的
txtUser = findViewById(R.id.txtLoginUser);
txtPass = findViewById(R.id.txtPass);
txtIP = findViewById(R.id.txtIP);
......

}
catch (Exception e)
{
e.printStackTrace();
Functions.ShowMessage("有异常。" + e.getMessage(), this); //这句话也可能会异常,所以没有装载成功时一定要调试一下
}

如果没有这个 try “包围”保护,程序就也会报上面的那个 “Unfortunately,程序名 has stopped”并退出。所以这种情况发生在别的地方时也可能会无声无息的在发生异常时而程序并未提示,让我们的程序出现不可思议的行为。这真的是个很严重的问题。不知道安卓或者是 java 下有没有什么通用的解决办法,总不能每个地方都 try 吧。如果没有的话,那就只能在 ide 使用 debug 模式时才能从调试的命令行输出中看到 java 默认的异常错误输出了。而在运行时是没有任何提示的。

这种情形让我想起著名的 C/C++ 中的闪退,这其实在 vc 的 ide debug 模式下是会有提示错误的。这恐怕是安卓的缺陷,或者是安卓下 java 的缺陷。在流行的开发语言中似乎只有 delphi 系会显示默认的异常处理结果。(当然标准 java 在命令行中也是提示了的)


总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录
android_studio 更多



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1