我一直在研究一款try/catch经常使用的Android应用程序,以防止它甚至在没有必要的地方崩溃.例如,
xml layout带有的视图id = toolbar引用如下:
// see new example below, this one is just confusing
// it seems like I am asking about empty try/catch
try {
View view = findViewById(R.id.toolbar);
}
catch(Exception e) {
}
Run Code Online (Sandbox Code Playgroud)
整个应用程序都使用此方法.堆栈跟踪没有打印,很难找到出错的地方.应用程序突然关闭而不打印任何堆栈跟踪.
我让我的大四学生向我解释,他说,
这是为了防止生产中的崩溃.
我完全不同意它.对我而言,这不是阻止应用程序崩溃的方法.它表明开发人员不知道他/她在做什么,并且有疑问.
这是行业中使用的方法,以防止企业应用程序崩溃?
如果try/catch是真的,那么我们真的需要可以附加一个带有UI线程或其他线程的异常处理程序并捕获所有内容吗?如果可能的话,那将是更好的方法.
是的,空try/catch是坏的,即使我们将堆栈跟踪或日志异常打印到服务器,try/catch在所有应用程序中随机包装代码块对我来说没有意义,例如当每个函数都包含在a中时try/catch.
UPDATE
由于这个问题引起了很多关注,有些人误解了这个问题(也许是因为我没有明确表达过),我将把它改写一下.
这是开发人员在这里做的事情
一个函数被编写和测试,它可以是一个小函数,它只是初始化视图或复杂的视图,在测试后它被包裹在try/catch块中.即使是永远不会抛出任何异常的函数.
这种做法在整个申请中使用.有时会打印堆栈跟踪,有时只会出现debug log一些随机错误消息.此错误消息因开发人员而异.
使用这种方法,应用程序不会崩溃,但应用程序的行为变得不确定.甚至有时候很难跟上出错的地方.
我一直在问的真正问题是; 为了防止企业应用程序崩溃,业界是否遵循这种做法?而且我不是在询问空的try/catch.是不是,用户喜欢不会比意外行为的应用程序崩溃的应用程序?因为它真的归结为崩溃或用空白屏幕呈现用户或行为用户不知道.
我在这里发布了一些真实代码的片段
private void …Run Code Online (Sandbox Code Playgroud)我正在no main manifest attribute运行由Intellij创建的jar.我提取了jar并观察到有另一个清单文件,而不是我在创建工件时指定的文件.
当我在IDE中打开清单时,它会正确显示所有内容,但在创建jar后,我会得到一个全新的清单文件.
Manifest-Version: 1.0
Main-Class: YoutubeList
Run Code Online (Sandbox Code Playgroud)
我尝试了其他答案中的每个解决方案,但仍然没有做到正确.为什么创建一个简单的jar是Intellij中的一项任务,它应该可以帮助开发人员!
编辑
有时它不包括Jar中的.class文件 could not found or load class
如何对不属于我的应用程序的活动应用结束转换.说,我正在打开联系人应用程序以选择联系人,我在打开联系人应用程序时应用向上滑动转换但关闭应用程序应用默认动画(向左滑动).
是否有可能在关闭时设置动画?
我编写了一个简单的 Annotation Processor(只是为了好玩),它将生成一些我在之前的项目中编写的样板代码。它实际上通过收集 Activity 类的注释来生成如下模块
@Module
abstract class ActivityInjectorModule {
@ContributesAndroidInjector
abstract fun providesMain2Activity(): Main2Activity
@ContributesAndroidInjector
abstract fun providesMainActivity(): MainActivity
}
Run Code Online (Sandbox Code Playgroud)
但是,当我使用 dagger 运行它时,dagger 似乎无法找到我的 annotation processor 生成的类。虽然生成了类并存在于生成的目录中,但我可以在我的源代码中使用它,但是在编译时,dagger 会产生以下异常。有什么专家建议吗?
error: cannot find symbol
@dagger.Component(modules = {dagger.android.AndroidInjectionModule.class, com.mallaudin.daggietest.di.AppModule.class, ActivityInjectorModule.class})
^
symbol: class ActivityInjectorModule
Run Code Online (Sandbox Code Playgroud)
这是主要的应用程序组件。
@Singleton
@Component(
modules = [
AndroidInjectionModule::class,
AppModule::class,
ActivityInjectorModule::class
]
)
interface AppComponent : AndroidInjector<App> {
@Component.Builder
interface Builder {
fun addContext(@BindsInstance ctx: Context): Builder
fun build(): AppComponent
}
}
Run Code Online (Sandbox Code Playgroud)
ActivityInjectorModule类由注解处理器生成,存在于生成目录中。
应用类
class App : …Run Code Online (Sandbox Code Playgroud) java android annotation-processing dagger-2 annotation-processor
我们需要通过滑动图像来协调旋转轮.我已经使用了ViewPager但是在360度旋转之后
我必须从X = 0开始滚动ViewPager.是否有任何ViewPager在滚动到最后位置后从第一页开始?
我使用setScrollX来滚动ViewPager,它也会在旋转动画中引入毛刺.我想要实现像下面的图像.
这是示例应用程序的链接,只是我想要实现的最小化实现.
android infinite-scroll android-scrollview android-viewpager android-scrolling
我正在从命令行运行 gradle 命令,我只想显示输出。有一个选项 -q, -quiet 表示它只会记录错误。运行命令后,我也得到了这个带有输出的废话。我怎么能阻止这个??
Welcome to Gradle 2.11.
To run a build, run gradle <task> ...
To see a list of available tasks, run gradle tasks
To see a list of command-line options, run gradle --help
To see more detail about a task, run gradle help --task <task>
Run Code Online (Sandbox Code Playgroud) class Animal {
val name: String
constructor(name: String){
this.name = name // initialized via constructor
}
}
Run Code Online (Sandbox Code Playgroud)
对于上面的类,Kotlin我能够通过辅助构造函数初始化val属性,但Data类不允许这样做
data class User(val name: String, val postalCode: Int) {
val email: String
constructor( email: String): this("", 1){
this.email = email // error: value can not be reassigned
}
}
Run Code Online (Sandbox Code Playgroud)
我无法理解的是,电子邮件属性已经初始化,因为我还没有声明任何初始化?
注意:我搜索了一个小时并尝试了stackoverflow已经提供的所有解决方案.
我正在研究主题叠加.我制作了一个示例应用程序,它会在单击操作栏图标时打开一个弹出菜单.这是我的styles.xml
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Light">
<item name="android:textColorPrimary">@color/colorAccent</item>
</style>
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark">
<!-- added all to see which one will work.-->
<item name="android:popupMenuStyle">@style/PopupMenu</item>
<item name="android:itemBackground">@color/colorAccent</item>
<item name="android:colorBackground">@color/colorAccent</item>
</style>
<style name="PopupMenu" parent="@android:style/Widget.PopupMenu">
<item name="android:popupBackground">@color/colorAccent</item>
</style>
</resources>
Run Code Online (Sandbox Code Playgroud)
这是我的工具栏样式.
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</android.support.design.widget.AppBarLayout>
Run Code Online (Sandbox Code Playgroud)
我把它设置为popupTheme我的 …
我有混合Java和Kotlin中,我想从运行演示项目的代码command line。仅对于 java,我可以运行该程序,java -jar foo.jar但是当我使用Kotlin代码中的任何类时,它会生成java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
我尝试了不同的解决方案并检查了jar文件。它包含这两个类,但我想kotlin-runtimejar 中缺少它。
这是build.gradle文件
plugins {
id 'java-library'
id 'org.jetbrains.kotlin.jvm'
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin/'
test.java.srcDirs += 'src/test/kotlin/'
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
testImplementation 'junit:junit:4.12'
}
jar {
manifest {
attributes 'Main-Class': 'com.mallaudin.App'
}
from {
configurations.compile.collect {
it.isDirectory()? it: zipTree(it)
}
}
}
Run Code Online (Sandbox Code Playgroud)
生成jar文件的内容
.
??? com
? ??? mallaudin
? ??? App.class …Run Code Online (Sandbox Code Playgroud) 我怎样才能获得package name,generic type并且Parametrized type从type从field element在注释处理器?
说,如果Element.asType回来java.util.List<String>,我想得到
java.utilList<E>或原始类型List(最好是原始类型)String有没有方法element utils,type utils?
android ×5
java ×5
gradle ×2
kotlin ×2
animation ×1
annotations ×1
coding-style ×1
command-line ×1
compilation ×1
dagger-2 ×1
data-class ×1
gradle-task ×1
jar ×1
themes ×1
try-catch ×1